1. 内容回顾
1. 正向查找(详见day69内容回顾时间.py)
1. 基于对象的查询(SQL:子查询)
2. 基于双下划线的跨表查询(SQL:join)
2. 反向查找(详见day69内容回顾时间.py)
1. 基于对象的查询
2. 基于双下划线的跨表查询
2. 多对多关系
ManyToManyField()多设置在正向查询多的那一边。
1. 三种建立多对多关系的方式
1. 自己创建第三张表,分别外键关联两张表
2. ORM自带的ManyToManyField()建立多对多关联关系
ORM提供了一堆方法,操作方便:
1. all()
2. set()
3. add()
4. remove()
5. clear()
6. create()
3. 自己创建第三张表,并且设置ManyToManyField()关联关系(中介者模型)
books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
注意事项:
1. through="Author2Book",设置通过哪张表建立多对多关系
2.through_fields=("a", "book"),设置关联字段的顺序
优点:
1. 我可以自行扩展第三张表存储的字段
2. 可以使用连表查询的快捷方法
缺点:
1.要自己建第三张表
2. 无法使用 . set()、add()、remove()、clear()、create()
而是通过 models.Author2Book.objects 直接操作第三张表!!!
3. 聚合
from django.db.models import Avg, Sum, Max, Min, Count
# 求所有书的平均价格
models.Book.objects.all().aggregate(avg_price=Avg("price")) --> 字典{“avg_price”: xx}
4. 分组
1. SQL语句 分组
# 求部门的平均薪资
SELECT AVG("salary") FROM employee GROUP BY dept;
# 连表查询
SELECT dept2.name, AVG(salary) FROM employee2 INNER JOIN dept2 ON employee2.dept_id = dept2.id GROUP BY dept_id;
2. ORM
# 求部门的平均薪资
models.Employee.objects.values("dept").annotate(salary_avg=Avg("salary")).values("dept", "salary_avg")
# 连表查询
models.Employee2.objects.values("dept__name").annotate(salary_avg=Avg("salary")).values("dept__name", "salary_avg")
2. 今日内容
1. F查询
1. 两个字段之间作比较
models.Product.objects.filter(maichu__gt=F("kucun"))
2. 字符串拼接
from django.db.models.functions import Concat
from django.db.models import Value
models.Product.objects.update(name=Concat(F("name"), Value("新款")))
2. update修改字段和对象.属性修改字段的区别:
1. 对象.属性方法会更新所有字段
2. update方法只会更新你修改的那个字段
实例
查询评论数大于收藏数的书籍 from django.db.models import F models.Book.objects.filter(commnet_num__gt=F('keep_num')) Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。 models.Book.objects.filter(commnet_num__lt=F('keep_num')*2) 修改操作也可以使用F函数,比如将每一本书的价格提高30元 models.Book.objects.all().update(price=F("price")+30)