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查询后面

浙公网安备 33010602011771号