Django的orm(一)
Django的orm一
1.创建表
1.1 创建普通表
class UserType(models.Model):
'''
用户类型
'''
title=models.CharField(max_length=16)
1.2 创建外键依赖
class UserInfo(models.Model):
'''
用户表
'''
username=models.CharField(max_length=16)
age=models.IntegerField()
ut=models.ForeignKey('UserType',on_delete=models.CASCADE)
不指定主键的类,在执行命令的时候会直接多同步出一列id字段;
1.3 修改表
- 增加表,直接添加类
- 注意此时,数据库中若是有数据需要允许为空(或者设置默认值defualt)
class Foo(models.Model):
name=models.CharField(max_length=16)
class UserType(models.Model):
'''
用户类型
'''
title=models.CharField(max_length=16)
uf=models.ForeignKey(to='Foo',on_delete=models.CASCADE)
1.4 常用字段
# 字符串
models.CharFiled(max_length=?)
# 整数型
models.IntegerField()
# 布尔值字段
models.BooleanField(verbose_name='别名每个类型都可以有', default=False)#默认值
# 时间类型
models.DateTimeField(verbose_name='创建时间', auto_now_add=True)#设置自动添加
# 大整数
models.BigIntegerField()
# 正整数
models.PositiveIntegerField(verbose_name='价格')
# 小数值-存储的一般是0-9的单个值,代表对应的值
models.SmallIntegerField()
# 外键
models.ForeignKey(to="表",on_delete=models.CASCADE)
category_choices = (
(1, '免费版'),
(2, '收费版'),
(3, '其他'),
)
category = models.SmallIntegerField(verbose_name='收费类型', default=2, choices=category_choices)
models.DateTimeField(verbose_name='开始时间', null=True, blank=True)
-
blank
设置为True时,字段可以为空。设置为False时,字段是必须填写的。字符型字段CharField和TextField是用空字符串来存储空值的。如果为True,字段允许为空,默认不允许。
-
null
设置为True时,django用Null来存储空值。日期型、时间型和数字型字段不接受空字符串。所以设置IntegerField,DateTimeField型字段可以为空时,需要将blank,null均设为True
2. 执行命令
# 1.生成记录的名称
python manage.py makemigrations
# 2.生成到数据库中的命令
python manage.py migration
生成的记录文件在对应的APP的migrations文件夹下;
3.插入数据
# 插入数据
models.UserType.objects.create(title="1")
models.UserType.objects.create(title="2")
models.UserType.objects.create(title="3")
models.UserInfo.objects.create(username="逻辑",age="30",ut_id="1")#数据库中的外键,为ut_id
models.UserInfo.objects.create(username="程心",age="35",ut_id="1")
models.UserInfo.objects.create(username="艾AA",age="27",ut_id="2")
models.UserInfo.objects.create(username="曼努尔·雷迪亚兹",age="30",ut_id="3")
4.简单查询
4.1 查询所有
res=models.UserInfo.objects.all()
print(res)
返回的是对象类型QuerySet(类似列表),包含很多对象,一个对象就是一行数据;
-
循环显示
-
res=models.UserInfo.objects.all() print(res) for row in res: print(row.id,row.username)
4.2 条件查询
res_list=models.UserInfo.objects.filter(id=1,username="逻辑")#默认是and连接的
print(res_list[0].username)
4.3 简单介绍双下划线
-
gt大于;lt小于
-
res_list=models.UserInfo.objects.filter(id__gt=2)#查找id大于2的 res_list1=models.UserInfo.objects.filter(id__lt=2)#查找id小于2的
5.删除数据
-
models.UserInfo.objects.filter(id=4).delete()
6.更改数据
models.UserInfo.objects.filter(id=3).update(age=18)
8.连表查询
8.1 正向操作
- 包含外键字段的表,直接使用表可以找出关联表的对应数据行(一条);
reslist=models.UserInfo.objects.all()
for res in reslist:
print(res.username,res.age,res.ut_id,res.ut)#两张表连接
# print(res.ut)#对象,代表usertype中的一行数据
# print(res.ut.title)
# print(res.ut.uf)#uf的对象
# print(res.ut.uf_id)#uf的对象
# print(res.ut.uf.name)#uf的对象,连接到第三张表
return HttpResponse("Hello world")
8.2反向操作
- 被关联的表,不包含外键的字段;但是可以使用,表名小写_set,取出对应的值与数据(多条);
obj=models.UserType.objects.all().first()#取得第一条数据
print(obj.title,obj.userinfo_set)
for row in obj.userinfo_set.all():
print(row.username,row.age)
# 待条件的反向操作
reslist=models.UserType.objects.all()
for item in reslist:
print(item.title,item.userinfo_set.filter(username="逻辑"))
9.返回值
9.1 Values
- 返回的
QuerySet
内部是字典类型;
res=models.UserInfo.objects.all().values('id','username')
# res依旧是queryset但是内部是字典类型
print(res)
for item in res:
print(item)
9.2 Values_list
- 返回的
QuerySet
内部类型是元组;
res_list=models.UserInfo.objects.all().values_list('id','username')
# 取出的依旧是两列,内部是列表类型
for res in res_list:
print(res)
9.3返回值总结
-
返回对象
models.Userinfo.objects.all() models.Userinfo.objects.filter(id__gt=1)# id>1
返回的对象可以使用
.
进行操作 -
返回字典
models.Userinfo.objects.all().values('id','username')# 填入对应的值
-
返回元组
models.Userinfo.objects.all().values_list('id','username')# 填入对应的值
-
注意:字典和元组不能像对象一样进行跨表;因此跨表的时候需要在传入对应的参数,使用双下划线;
# 跨表字段使用双下滑线进行操作;元组中也是这样; res=models.UserInfo.objects.all().values('id','username','ut__title') # res依旧是queryset但是内部是字典类型 print(res) for item in res: print(item)
继续努力,终成大器;