双下划线跨表查询 聚集查询 分组查询 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查询可以多重嵌套
posted @ 2019-11-26 17:49  边城bei  阅读(116)  评论(0编辑  收藏  举报