本文介绍: authors=models.ManyToManyField(to=’Author‘,through=’booktoauthor‘, through_fields=(‘当前表–》到中间表的外键关系‘,’剩下的写在第二个位置‘))Book.objects.filter((Q(name=’红楼梦’) & Q(price__gt=100))|Q(nid__gt=2))-与条件and条件,在filter直接写—》就是and条件三张表都要手动创建–》3个类–》3个表模型—》

【1】多表操作

【2】聚合查询(aggregate)

aggregate是 QuerySet一个终止子句用来聚合查询

 

Book.objects.all().aggregate(Avg('price'))

【3】分组查询(annotate)

分组查询一般和聚合查询组合使用annotate用来分组聚合

分组目的:

        把有相同特征的分成一组,分成一组后一般用来统计条数统计平均数,求最大值

【4】F查询

F查询:拿到某个字段表中具体的值

 

示例

        

 from django.db.models import F
        Book.objects.filter(评论__gt=F('收藏数'))
        -让所有图书价格 +1
        Book.objects.all().update(price=F('price')+1)

【5】Q查询

Q查询:为了组装成  与  或  非 条件

 

-与条件:and条件,在filter直接写—》就是and条件
            Book.objects.filter(authors__name=”lqz”,price=100)

-或条件:Book.objects.filter(Q(authors__name=”lqz”)|Q(authors__name=”justin“))

-非条件:Book.objects.filter(~Q(name=’红楼梦’))
        
复杂逻辑:(名字为红楼梦并且价格大于100) 或者 id 大于 2

        Book.objects.filter((Q(name=’红楼梦’) & Q(price__gt=100))|Q(nid__gt=2))

【6】其它字段和字段参数

     【6.1】字段参数:ORM字段参数

【6.2】ForeignKey属性

【7】中间表创建三种方式

        第一种:自动创建

自动创建用不到throughthrough_fiel

 

authors = models.ManyToManyField(to='关联的表名')

        第二种:半自动创建

手动创建中间表,使用through指定

 

 三张表都要手动创建–》3个类–》3个表模型—》
    # 什么情况会使用手动创建?—-中间表如果有多的字段,都是手动创建
    # authors=models.ManyToManyField(to=’Author’,through=’booktoauthor’, through_fields=(‘当前表–》到中间表的外键关系’,’剩下的写在第二个位置‘))

 

半自动:自己创建第三张表,利用 ManyToManyField 在某张表指定关联关系
优点:可以自定义字段,依旧支持基于下划线、对象的反向查询,可扩展性高
多对多字段的方法支持了(addset,remove,clear)
class Book(models.Model):
     ...
     authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))
 
 
class Author(models.Model):
     ...
    books = models.ManyToManyField(to='Book', through='Book2Author', through_fields=('author', 'book'))
 
class Book2Author(models.Model):
     book = models.ForeignKey(to='Book')
     author = models.ForeignKey(to='Author')
     create_time = models.DateField(auto_now_add=True)
 # through 告诉 django orm 书籍表和作者表的多对多关系是通过 Book2Author 来记录的
 # through fields 告诉 django orm 记录关系时用过 Book2Author 表中book 字段 和 author字段 来记录的(第一个参数 book 是  关联表book 所依赖的字段)
 # 但是,多对多字段的 add set remove clear 四个方法就用不了了
# 1.半自动 一定要加两个额外的参数
      through='Book2Author', through_fields=('book','author')
# 2.后面字段的顺序第三张表通过哪个字段查询单表 就把哪个字段放前面

        第三种,纯手动创建

使用ManyToManyField关联

 

纯手动:手动创建第三张表,然后利用 Foreignkey 自己做两张表的关联
优点:第三张表可以新增任意字段,扩展性较高
不足:查询不方便,基于下划线、对象的反向查询都不支持了
            class Book(models.Model):
                ...
                
            class Author(models.Models):
                ...
            
            class Book2Author(models.Model):
                book_id = models.ForeignKey(to='Book')
                author_id = models.ForeignKey(to='Author')
                create_time = models.DateField(auto_now_add=True)
                ...

原文地址:https://blog.csdn.net/m0_69962105/article/details/134794291

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_42830.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注