目录
方式二、获取外键表对象id,给类定义的关系变量,赋值查询到的对象
六、聚合查询(aggregate() + 聚合函数(Avg,Max,Min…))
七、分组查询(annotate() + 聚合函数(Avg,Max,Min…))
- filter、annotate、values的使用顺序,及不同
八、F查询(对同一个model实例中的两个不同字段进行比较)
- models新增(book标下的阅读数字段和评论数字段)
一、建立多表关系结构
总结:
- 一对一关系:OneToOneField
- 一对多关系:ForeignKey
- 多对多关系(自动生成中间表):ManyToManyField
- 用了OneToOneField和ForeignKey,模型表的外键字段,默认末尾添加_id
- 表的名字 myapp_modelName 自动生成,但是可以覆写为其他名字。
- 外键字段 ForeignKey 有一个 null=True 的设置(它允许外键接受空值 NULL),你可以赋给它空值 None 。
- 主键字段使用primary_key,调用时可以使用简写‘pk’
- 多表关系的参数 to:to = ‘‘models内部自生表’’,to = 外部表 ---- 即,导入的表结构不能加引号
from django.db import models # 出版社数据表 class Publish(models.Model): # id如果不写,会自动生成,名字叫nid,并且自增 id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) addr = models.CharField(max_length=64) email = models.EmailField() # 作者表,与作者详细信息表建立一对一的关系(OneToOneField) class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) # 数字类型 sex = models.IntegerField() # 可以用 ForeignKey(如下),但是得设置唯一性约束,会报警告,不建议用,建议用OneToOneField # authordetail= models.ForeignKey(unique=True) # to='AuthorDetail' 使用引号,表存在即可;不适用引号,数据表类必须在此类之前定义,才能被找到 # 与表 AuthorDetail 的 id字段建立一对一的关系 authordetail = models.OneToOneField(to='AuthorDetail', to_field='id') def __str__(self): return self.name # 作者信息详细表,被作者表建立一对一的关系 class AuthorDetail(models.Model): id = models.AutoField(primary_key=True) phone = models.CharField(max_length=32) addr = models.CharField(max_length=64) # 书籍表,和作者表建立多对多的关系(ManyToManyField) - 自动生成中间表 book_authors # 与出版社表建立一对多关系(ForeignKey) class Book(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) # 一对多 publish = models.ForeignKey(to=Publish, to_field='id') # 多对多; to 后不加引号,指引类必须在此类前定义 authors = models.ManyToManyField(to=Author) # 重写此类被print的输出内容 def __str__(self): return self.name
二、一对多 and 一对一 表关系的记录操作
注意:一对多和一对一的数据记录操作方式相同
1、 增(两种方式)
方式一、create方式创建,指定字段名传输数据
# creat创建数据,将值传输给表内字段名publish_id ret=Book.objects.create(name='红楼梦',price=34.5,publish_id=1)
方式二、获取外键表对象id,给类定义的关系变量,赋值查询到的对象
# 获取出版社表,id为1的对象 publish=Publish.objects.get(id=1) # 同上获取 出版社表对象 pk是主键,通过主键查找 publish=Publish.objects.get(pk=1) # 获取出版社表对象,主键id=2的第一条数据对象,因为filter返回queryset对象 publish = Publish.objects.filter(pk=2).first() # creat对象,将获取的出版社表对象赋予 book类内提前建立表关系的变量名 # publish = models.ForeignKey(to=Publish, to_field='id') ret = Book.objects.create(name='西游记', price=34.5, publish=publish) print(ret.name)
2、改(两种方式)
方式一、获取对象,修改后save方法保存
# 获取book对象 book=Book.objects.get(pk=1) # book.publish=出版社对象 --- 同下 book.publish_id=2 book.save()
方式二、update方法更新
book=Book.objects.filter(pk=1).update(publish = 出版社对象) book=Book.objects.filter(pk=1).update(publish_id = 1)
三、多对多 表关系的记录操作
1、增 add()
# 为红楼梦这本书新增一个叫n1,n2的作者 # 获取author表内的数据对象 n1 对应id = 1,n2 对应id =2 n1=Author.objects.filter(name='n1').first() n2=Author.objects.filter(name='n2').first() # 获取书籍对象 book=Book.objects.filter(name='红楼梦').first() # add 添加单个对象 # book类.authore变量(建立多对多联系的变量).add(对象1) book.authors.add(n1) # add 添加多个对象 # book类.authore变量(建立多对多联系的变量).add(对象1,对象2) book.authors.add(n1,n2) # add 添加作者id # book类.authore变量(建立多对多联系的变量).add(准确内容) book.authors.add(1,2)
2、删除 remove()
#可以传对象,可以传id,可以传多值(,分割),不建议混用 book.authors.remove(n1) book.authors.remove(2) book.authors.remove(1,2)