05-Django模型(2)

1、特殊查询

  F和Q查询:

      之前的查询都是模型对象的属性与常量值比较,两个属性怎么比较呢?使用F查询。

F查询语法:

from django.db.models import F

F('属性名称')

F查询要求

# 1.查询id大于价格的书籍
# 2.查询价格大于2倍id的书籍
1.查询id大于价格的书籍
    book = Books.objects.all()
    book1 = book.filter(id__gt=F("price"))
    print(book1)
2.查询价格大于2倍id的书籍
    book = Books.objects.all()
    book1 = book.filter(price__gt=F("id")*2)
    print(book1)

 3、查询价格大于52,并且author_id小于3的图书

    book = Books.objects.all()
    book1 = book.filter(price__gt=52,author_id__lt=3)
    print(book1)
book1 = book.filter(price__gt=52).filter(author_id__lt=3)

Q查询

  Q查询语法:

from django.db models import Q

Q(模型属性1_条件运算符=值)|Q(模型属性2_条件运算符=值)

#(~非)
# 1.查询价格大于20,或id小于3的图书
# 2.查询id不等于3的书籍
1.查询价格大于20,或id小于3的图书
    book = Books.objects.all()
    book1 = book.filter(Q(price__gt=52)|Q(id__lt=3))
    print(book1)
 2.查询id不等于3的书籍(Q对象可以使用~非还有|或)
    book = Books.objects.all()
    book1 = book.filter(~Q(id=3))
    print(book1)

聚合函数

  使用aggregate()过滤器调用聚合函数,返回特定的对象。聚合函数包括AvgMaxMinSumCount(使用Count时,一般不需要aggregate()过滤器,直接调用即可),聚合函数被定义在django.db.models中。

1、统计总的价格数
    book = Books.objects.all()
    price_sum = book.aggregate(Sum("price"))
    print(price_sum)

关联查询

    基础关联查询


# 1.查询id为1的作者出版的书籍信息
# 2.查询id为2的书籍的作者信息

1.查询id为1的作者出版的书籍信息
    author = Authors.objects.get(pk=1)
    #书籍的外键是作者,因此先查询到pk=1的作者,然后再查书籍
    #由于书与作者是多对一,当由一去找多的时候,
    # 需要将多的类名小写在加_set在加上全部的
    book = author.books_set.all()
    print(book)
2.查询id为2的书籍的作者信息
    #先查出pk=2的这本书籍,再去查对应的作者
    book = Books.objects.get(pk=2)
    #查对应的作者  由于是多对一查找,直接点外键名就可以查出相关信息
    auth = book.author
    print(auth)

总结:当书籍的外键是作者的时候,

查询规则:

    多查一:(将书本查出来:直接将对象点外键对象就可以查出来)

   一查多:(将作者查出来:直接将作者对象点关联模型类类名小加_set即可查出)

  内连接查询(inner join)

  语法:

 

filter(关联模型类类名小写__属性名__运算符=值)
#例:filter(books__name="与时间做朋友")

 

  需求:

# 1.查询作者为"何帆"的所有书籍信息
# 2.查询作者的书籍中描述包含"时间"的作者
1.查询作者为"何帆"的所有书籍信息

 

    #1.查询作者为"何帆"的所有书籍信息
    #01\第一步我们可以先查书在过滤作者,由于是多找一,直接外键对象名加__属性名=“”
    auth = Books.objects.filter(author__name="何帆")
    print(auth)
2.查询作者的书籍中描述包含"时间"的作者
    #2.查询作者的书籍中描述包含"时间"的作者
    #先查询所有作者,在过滤出来关联书籍包含“时间”的信息
    #查询作者过滤书籍出来,是少查多,过滤规则是类模型名小写__属性名__条件名=“时间”
    auth = Authors.objects.filter(books__name__contains="时间")
    print(auth)

总结关联查询:

    当查询多过滤少的时候filter(外键对象名__属性名__条件=“”)

    当查询少过滤条件是多的时候filter(模型类名小写__属性名__条件=‘’)

posted @ 2019-10-12 18:21  一知.半解  阅读(137)  评论(0编辑  收藏  举报