zoukankan      html  css  js  c++  java
  • 双下划线跨表查询 聚集查询 分组查询 FQ查询

    from django.db import models
    
    class Author(models.Model):
        """
        作者表
        """
        name=models.CharField(verbose_name="作者名",max_length=32)
        age=models.IntegerField(verbose_name="年龄")
        sex = models.CharField(verbose_name='性别',max_length=32,choices=(('M','男'),('F','女')),default="M")
        au=models.OneToOneField("AuthorDetail",on_delete=models.CASCADE)
        def __str__(self):
            return self.name
    
    class AuthorDetail(models.Model):
        """
        作者详细信息表
        """
        birthday=models.DateField(verbose_name="生日")
        telephone=models.CharField(verbose_name="电话",max_length=11)
        addr=models.CharField(verbose_name="地址",max_length=64)
        def __str__(self):
            return self.telephone + self.addr
    
    
    class Publish(models.Model):
        """
        出版社表
        """
        name=models.CharField(verbose_name="出版社名",max_length=32)
        city=models.CharField(verbose_name="出版社城市",max_length=32)
        def __str__(self):
            return self.name
    
    class Book(models.Model):
        """
        书籍表
        """
        title = models.CharField(verbose_name="书名",max_length=32)
        publishDate=models.DateField(verbose_name="出版日期")
        price=models.DecimalField(verbose_name="价格",max_digits=5,decimal_places=2)
        comment = models.FloatField(verbose_name="评论",default=100)
        good = models.FloatField(verbose_name="点赞数",default=100)
        publishs=models.ForeignKey(to="Publish",on_delete=models.CASCADE,)
        authors=models.ManyToManyField('Author',)
        def __str__(self):
            return self.title
    

    双下跨表查询

    ​ Django 提供了一种直观而高效的方式在查询中表示关联关系,它能自动确认 SQL JOIN 联系。要做跨表查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的model 为止。

    ​ 正向查询按字段,反向查询按表名小写来告诉ORM引擎join哪张表,一对一、一对多、多对多都是一个写法,注意,写ORM查询的时候,哪个表在前哪个表在后都没问题,因为是join连表操作

    # 正向查询, 通过字段au查询
    models.Author.objects.filter(name='xx').values('au__telephone')
    
    # 反向查询, 通过小写表名查询
    models.AuthorDetail.objects.filter(author__name='xx').value('telephone')
    
    # 获取的是Queryset伪列表中包含着一个字典, 键为values中的字符串, 值为查询到的结果
    
    # 多对多查询
    models.Book.object.filter(title='xxx').values('authors__name')
    
    反向查询时, 如果表创建时外键设置了related_name, 则必须用related_name替换外键字段
    

    聚合查询

    aggregate(*args, **kwargs)
    aggregate()是QuerySet的一个终止句,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果想要为聚合值指定一个名称,可以向聚合子句提供它。
    
    from django.db.models import Avg,Sum,Max,Min,Count
    统计所有书的平均价格和价格最高的书
    models.Book.objects.all().aggregate(Avg('price'),Max('price'))
    # 得到的是python的字典格式, 可以起别名,a=Avg('price')
    

    分组查询

    models.Book.objects.values('publish').annotate(a=Avg('price'))
    models.Publish.objects.annotate(a=Avg('book__price')).values('a')
    # 必须起别名
    # 如果没有使用objects后面values或者values_list,得到的结果是queryset类型,里面是Publish的model对象,并且是对所有记录进行的统计,统计的Min(price)也成了这些model对象里面的一个属性
    # values写在annotate前面是作为分组依据用的,并且返回给你的值就是这个values里面的字段和分组统计的结果字段数据
    # values写在annotate后面按照Author表的id字段进行分组,返回给你的是这个表的所有model对象,这个对象里面包含着max_price这个属性,后面写values方法是获取的这些对象的属性的值,当然,可以加双下划线来连表获取其他关联表的数据,但是获取的其他关联表数据是你的这些model对象对应的数据,而关联获取的数据可能不是你想要的最大值对应的那些数据
    

    F查询

    # 对两个字段的值做比较
    from django.db.models import F
    models.Book.objects.filter(common__gt=F('good'))
    
    # 支持F()对象和常数之间的加减乘除取模等操作
    models.Book.objects.update(price=F('price')+100)
    # 所有的书的价格加100
    

    Q查询

    # Q对象可以使用&(与) 、|(或)、~(非) 操作符组合起来。当一个操作符在两个Q对象上使用时,它产生一个新的Q 对象。
    from django.db.models import Q
    models.Book.objects.filter(Q(price__gt=112)|Q(comment__lte=200))
    # Q查询可以多重嵌套
    
  • 相关阅读:
    js--DOM基本使用
    前端--js基础2
    前端--js基础1
    tcp/udp编程
    关于网络
    异常处理
    装饰器
    1.__new__ 魔术方法 单态(例)模式 __del__ 魔术方法(析构方法) __call__ 魔术方法
    面向对象程序设计及面向对象封装 目录
    script 标签里的 async 和 defer
  • 原文地址:https://www.cnblogs.com/beichen123/p/11937296.html
Copyright © 2011-2022 走看看