F查询和Q查询

2020-06-16  本文已影响0人  wit92
  1. F查询
    查询条件是字段间的比较
class Book(models.Model):
    title = models.CharField(max_length=32)
    buy_num=models.BigIntegerField()
    keep_num=models.BigIntegerField()

查询所有购买数大于收藏数的书籍

Book.objects.filter(buy_num__gt=F("keep_num"))
<QuerySet [<Book: Book object>, <Book: Book object>]>
for i in  Book.objects.filter(buy_num__gt=F("keep_num")):
    print(i.title)

打印结果:

django
c++

扩展的两个:
①将每种书籍的购买数+1000
Book.objects.all().update(buy_num=F("buy_num")+1000)
返回结果是3,表示执行了三条记录

②将所有书籍的名字前面加上“最新版”三个字

from django.db.models.functions import Concat
from django.db.models import Value
Book.objects.filter().update(title=Concat( Value("计算机出版社"),F("title"),Value("最新版")))

注意:filter()如果不传参数的话,表示取所有的,等价于all()

2.Q查询
| 表示取或
& 表示取且
~ 表示取反
Q(条件1) | Q(条件2)
Q(条件1) & Q(条件2)
Q(条件1) & ~Q(条件2)
当Q查询和关键字查询都有的时候,Q查询要写在前面

from django.db.models import F,Q

Book.objects.filter(Q(title__contains="c++")|Q(buy_num__gt=1000),keep_num__lt=9)

打印结果:

<QuerySet [<Book: Book object>]>
Book.objects.filter(Q(title__contains="c++")|Q(buy_num__gt=1000),keep_num__lt=9).first().title

打印结果:

'计算机出版社c++最新版'
上一篇 下一篇

猜你喜欢

热点阅读