|
ORM:(在django中,根据代码中的类自动生成数据库的表也叫--code first)
ORM:Object Relational Mapping(关系对象映射)
我们提供的服务有:成都网站设计、做网站、微信公众号开发、网站优化、网站认证、循化ssl等。为上千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的循化网站制作公司
我们写的类表示数据库中的表
我们根据这个类创建的对象是数据库表里的一行数据
obj.id obj.name.....就是数据库一行数据中的一部分数据
ORM--First:
我们在学习django中的orm的时候,我们可以把一对多,多对多,分为正向和反向查找两种方式。
1
2
3
4
5
6
7
| class UserType(models.Model):
caption = models.CharField(max_length=32)
class UserInfo(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
user_type = models.ForeignKey('UserType')#外键
|
正向查找:ForeignKey在 UserInfo表中,如果从UserInfo表开始向其他的表进行查询,这个就是正向操作,反之如果从UserType表去查询其他的表这个就是反向操作。
马上就要开始我们的orm查询之旅!!!
建表+配置url+views中写相应的函数
models.py(在django中仅且只能在这里写数据库的相关类)
1
2
3
4
5
6
7
| class UserType(models.Model):
caption = models.CharField(max_length=32)
class UserInfo(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
user_type = models.ForeignKey('UserType')
|
这里我们使用sqlite3数据库,在settings中使用默认设置就可以了
url.py中的配置
1
2
3
4
5
6
7
8
9
| from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^user_type',views.user_type),
url(r'^user_info',views.user_info),
]
|
views.py先不进行任何操作,我们先保证正常访问已经设置的url
1
2
3
4
5
6
7
| from django.shortcuts import render,HttpResponse
def user_type(req):
return HttpResponse("ok")
def user_info(req):
return HttpResponse("ok")
|
先在表中插入几个数据用于测试:
usertype表
userinfo表数据插入:
所以我们在创建UserType数据的时候有两种方法:第一种方法是直接根据这个字段进行添加数据!给user_type 加 '_id'
1
2
3
4
| def user_info(request):
dic = {'username':'mosson','age':18,'user_type_id':1}
models.UserInfo.objects.create(**dic)
return HttpResponse('OK')
|
或者通过对象添加
1
2
3
4
5
6
7
| #先获取组的对象
usertype = models.UserType.objects.fiter(id=2)
#添加的时候直接添加对象就可以
models.UserInfo.objects.create(username='seven',age=18,user_type=usertype)
#写成一行也行
models.UserInfo.objects.create(username='lile',age=18,user_type=models.UserType.objects.filter(id=1))
|
django的get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错。
django的filter方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。
ORM的一对多:
我们在设计表结构的时候什么时候使用一对多呢?
比如我们在建立用户的时候有个菜单让我们选择用户类型的时候,使用一对多!!
1、一对多的正向查找:
正向查:ForeignKey在UserInfo表里,如果根据UserInfo这张表去查询这两张关联的表的合起来的内容就是正向查
反向查:ForeignKey不在UserType里,如果根据UserType这张表去查询这两张关联的表的合起来的内容就是反向查
正向查-demo1--查询所有用户为COO 的用户
在django中外键就相当于简单的使用__连表,在外键那个对象中封装了user_type表中的所有字段
我们要查询所有用户为CEO的用户,我们是不是的根据UserType这张表去查,如果是跨表查询使用“双下划线” + 属性
1
2
3
4
5
6
7
| from app01 import models
def index(req):
ret = models.UserInfo.objects.filter(user_type__caption='COO')
print(ret)
for item in ret:
print(item,item.username,item.age,item.user_type.caption)
return HttpResponse("OK")
|
查询结果:
反向查询:--
我们可以根据下面的命令,取出一个用户组,那么对于这个用户组他有多少个用户呢?
1
| models.UserType.objects.get(id=1)
|
1
2
3
4
5
6
7
8
9
10
11
| obj=models.UserType.objects.get(id=1)
obj.caption====得到在UserType表中id为1对应的caption
obj.id======得到在UserType表中id为1
obj.userinfo_set #理解为一种能力,可以获取所有当前这个用户类型的用户/或者这个用户类型的多个用户
obj.userinfo_set.all() #获取所有用户类型为COO的用户
obj.userinfo_set.filter(username='tim') #获取用户类型为COO的并且用户为tim的用户
'''
这.userinfo_set.相当于什么?它相当于 models.UserInfo.objects.filter(user_type=obj)
'''
|
反向查询实例:查询COO用户下的所有的用户名
1
2
3
| ret = models.UserType.objects.filter(caption='COO').values('userinfo__username')
for item in ret:
print(item,type(item))
|
方法二、
1
2
3
4
| ret = models.UserType.objects.filter(caption='COO').first()
for item in ret.userinfo_set.all():
print(item.username)
|
总结:
正向查找:
filter(跨表的时候,应该是对象__跨表的字段)
获取这个值的时候,拿到了一行数据的时候 line.对象.跨表的字段
反向查找:
filter(关联这个表的表明) 自动创建和表明相同的对象,通过这个对象__跨表的字段
line.自动创建和表明相同的对象_set.方法
ORM多对多 系统生成第三张表:
多对多和一对多没有任何关系
models.py
1
2
3
4
5
6
7
8
| class Host(models.Model):
hostname = models.CharField(max_length=32)
port = models.IntegerField()
class HostAdmin(models.Model):
username = models.CharField(max_length=32)
email = models.CharField(max_length=32)
host = models.ManyToManyField('Host')
|