在不提取创建对象的情形进行数据修改
如果没有F对象,按照前面课程的内容,我们要实现一个点赞的功能:
1.创建一个对象,并读取点赞的基数
2.在创建的对象上+1
3.将对象保存回数据库。
这样看似没问题,但是同一时间点有100个人创建了对象并且点赞,基数是10,100个人在点赞后理论的同一时间保存进数据库,那么100个人保存的数据都是10+1,可能100人点赞后,结果是11.相当于100个人提交给数据库的数据是11.
而F对象直接包裹数据库的值,使用F对象相当于提交给数据该字段+=1,利用数据库的锁将100个人串联起来。不会存在100个人取出字段值再保存的情行。相当于100=F个人操作+1
from django.db.models import F
def add_like(request,topic_id):
topic = Topic.objects.get(id=topic_id)
topic.like = F('点赞量') + 1
topic.save()
另外可以对数据库字段值进行比较
from django.db.models import F
from bookstore.models import Book
books = Book.objects.filter(mark_price__gt=F('price'))
for book in books:
print(book.title,'定价:',book.price,'现价:',book.mark_price)
2.Q对象
或| 与& 非~ 等操作,引用django.db.models中
如
from django.db.models import Q # 查找定价和成本都小于20元的书 Book.objects.filter(Q(price__lt=20)|Q(mark_price__lt=20))



