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)