Django项目 多对多查询/分组和聚合 /F/Q查询

create(): 创建一个新的对象,保存对象 并将他添加到关联对象集之中,返回新创建的对象

author_obj = models.Author.objcets.frist()      #作者表查询到第一个作者 

author_obj.books.create(name="新创建的书名",publisher_id =2 )  #通过作者创建一本书

add():添加

book_obj = models.Book.objects.get(id = 4)   #先在Book表中找到id=4的书

author_obj.books.add(book_obj)   #   将这本书添加

add():添加多个

book_objs = models.Book.objects.filter(id_gt = 5)  #找到id值大于5的书

author_obj.books.add(*book_objs)  #把列表打散再传进去    添加********号

add():直接通过id添加

author_obj.books.add(9)

remove():删除

book_obj =models.Book.objects.get(name ="要删除的书名")

author_obj.books.remove(book_obj)

remove():直接删除id

author_obj.books.remove(6)

clear():清空

clear_obj = models.Author.objcets.get(id =2)   #找到id为2的作者

clear_obj .books.clear()  #删除作者相关联的书

补充:当外键设置为不能为空时,remove()或者 clear()  时会报错   要把null设置为True

 

分组和聚合:

聚合:aggregate()

from django.db.models import Avg,Sum,Max,Min, Count

ret = models.Book.objects.all().aggregate(price_avg=Avg(price))   #price 是一个价格的字段     求价格的平均值

ret = models.Book.objects.all().aggregate(price_avg=Avg(price),price_max =Max(price),price_sum=Sum(price))  #求平均值 最大值 总和

分组:annotate()

ret = models.Book.objects.all().annotate(author_num = Count("author"))  #查询每本书的作者数量 

for book in ret:

print("书名:{},作者数量:{}".format(book.name,book.author_num))

ret = models.Book.objects.all().annotate(author_num = Count("author")) .filter(author_num__gt=1)  #查询每本书的作者数量大于1的

F/Q查询:

F查询:

from django.db.models import F

ret =models.Book.objects.filter(库存_gt=F("卖出"))   # 查询库存数量大于卖出数量的书

刷单操作:  每本书的卖出数量  *3

models.Book.objects.update(maichu=F("maichu")*3)   

#每本书的书名添加“第一版”三个字

models.Book.objects.update(title=Concat F("title"),value("第一版"))   coucat  拼接 

Q查询:    或者查询

from django.db.models import  Q 

ret = models.Book.objects.filter(Q(maichu__gt=1000) | Q(price__lt=100),name__contains="模糊查询书名")  #查询卖出数大于1000,或者价格小于100的所有书

 注意:Q查询和字段查询同时存在时 字段查询要写在Q查询后面

 

posted @ 2022-04-05 20:53  张丶先森  阅读(214)  评论(0)    收藏  举报