已有表
from django.db.models import Model, F, Q
class Goods(Model):
name = CharField(max_length=32, verbose_name='产品名称')
surplus = IntegerField(verbose_name='余量')
sales = IntegerField(verbose_name="销量")
total = IntegerField(verbose_name="总量")
已有数据
id | name | surplus | sales | total |
---|---|---|---|---|
1 | 商品A | 1 | 1 | 2 |
2 | 商品B | 1 | 0 | 1 |
3 | 商品C | 0 | 1 | 1 |
4 | 商品D | 0 | 0 | 3 |
F查询
根据同一条数据中两个值的对比查询
例: 查询余量和销量相同的商品, 需要查到 商品A
Goods.objects.filter(surplus=F('sales'))
查询余量小于销量的商品, 需要查到 商品C
Goods.objects.filter(surplus__lt=F('sales'))
- F查询还可以在查询中进行计算
查询余量加销量等于总量的商品, 需要查到 商品A B C
Goods.objects.filter(total=F('sales') + F('surplus'))
- F表达式功能还有很多,这里只是总结了一些用到的查询方法,其余功能可以参考官方文档:Django—F表达式
Q查询
Django查询的 or 操作
例: 查询总量为2, 或者总量为3的商品, 需要查到商品A和商品D
Goods.objects.filter(Q(total=2) | Q(total=3))
~Q 不等于
例: 查询总量不等于3的商品, 需要查到 商品A B C
Goods.objects.filter(~Q(total=3))
F查询和Q查询混合使用
例: 查询余量加销量不等于总量的商品, 需要查到商品D
Goods.objects.filter(Q(total__lt=F('sales') + F('surplus')) | Q(total__gt=F('sales') + F('surplus')))
或者这样
Goods.objects.filter(~Q(total=F('sales') + F('surplus')))