18.F和Q查询

1.F查询

使用F可以动态的获取一个字段的值
现在有一张Book表:

class Book(models.Model):
    title = models.CharField(max_length=32,unique=True)
    price = models.DecimalField(max_digits=5,decimal_places=2)
    sale = models.IntegerField()
    store = models.IntegerField()
    publisher = models.ForeignKey("Publisher",on_delete=models.CASCADE,related_name="books",related_query_name="fuck")

1.查询销量大于库存的书

不用F查询:

books = models.Book.objects.all()
for book in books:
    if book.sale > book.store:
        print(book)

使用F查询

from django.db.models import F
ret = models.Book.objects.filter(sale__gt=F("store"))
print(ret)

2.将所有书的库存翻倍

不使用F查询

books = models.Book.objects.all()
for book in books:
	book.store  = book.store * 2
	book.save()

使用F查询

models.Book.objects.all().update(store=F("store")*2)

2.Q查询

使用Q查询,可以写入多个条件,而且支持条件指点的与(&)、或(|)、非(~)运算,而且Q条件可以嵌套

1.查询价格大于50小与500的书

不使用Q查询:

 ret = models.Book.objects.filter(price__gt=50)
    for i in ret:
        if i.price < 500:
            print(i)

使用Q查询:

from django.db.models import Q

ret = models.Book.objects.filter(Q(price__gt=50) & Q(price__lt=500))

也可以嵌套写,没什么卵用而且容易搞晕自己,不建议:
ret = models.Book.objects.filter((Q(~Q(price__lte=50))) & Q(~Q(price__gte=500)))

print(ret)

2.查询价格大于50或销量大于100的书

不使用Q查询

lst = []
ret1 = models.Book.objects.filter(price__gt=50)
ret2 = models.Book.objects.filter(sale__gt=50)
lst.extend(ret1)
for i in ret2:
	if i not in lst:
    	lst.append(i)
print(lst)

使用Q查询

ret = models.Book.objects.filter(Q(price__gt=50) | Q(sale__gt=100))
print(ret)

Q查询的另一种写法:

q = Q()
q.connector = "OR"   #connector代表运算符,可以是与(AND &)、或(OR |),默认是AND
#q.children.appen(Q(...))  添加查询条件
q.children.append(Q(qq__contains=query))   #也可以是:q.children.append((qq__contains,query))
q.children.append(Q(name__contains=query))
models.Customer.objects.filter(q)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值