1. 内容回顾

 

1. 正向查找(详见day69内容回顾时间.py)

   1. 基于对象的查询(SQL:子查询)

   2. 基于双下划线的跨表查询(SQL:join)

 Django之F和Q查询等其他查询

Django之F和Q查询等其他查询

Django之F和Q查询等其他查询

 

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)
View Code

相关文章:

  • 2022-12-23
  • 2021-10-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-05
  • 2022-12-23
猜你喜欢
  • 2021-07-31
  • 2021-11-30
  • 2022-12-23
  • 2022-02-21
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案