F对象与Q对象
-
F对象(标记字段)
- 定义:一个F对象代表数据库中某条记录的字段的信息
- 作用:
- 通常时对数据库中的字段值在不获取的情况下进行操作
- 用于类属性(字段)之间的比较
- 语法:
from django.db.models import F f('列名')
- 示例1:
#更新Book实例中,将每本书的零售价上涨10元 -- F对象实现 Book.objects.all().update(market_price=F('market_price') + 10) # market_price += 10 #等同于sql语句 -> UPDATE 'bookstore_book' SET 'market_price' = ('bookstore_book'.'market_price' + 10)
#更新Book实例中,将每本书的零售价上涨10元 -- 常规操作实现 books = Book.objects.all() for book in books: book.market_price = book.market_price + 10 #先将每本书的售价查询出来,再加上10 book.save()
- 示例2:文章点赞
# 常规点赞操作 def add_like(request,topic_id): topic = Topic.objects.get(id = topic_id) #查询出点赞的文章 new_like = topic.like + 1 #取出当前文章的点赞数,并增加1 """等同于sql语句:update topic set like =1 where id = xxx""" topic.like = new_like #将增加后的点赞数复制到字段中 topic.save() # 保存
使用常规方法实现点赞:假设同时有一万条点赞数据进行并行处理,这一万条数据的topic.like查询到的like值都为0,执行#使用F对象实现 def add_like(request,topic_id): topic = Topic.objects.get(id = topic_id) #查询出点赞的文章 topic.like = F('like') + 1 #等同于 topic.like += 1 """等同与mysql 语句: update topic set like = like +1 where id = xxx""" topic.save()
new_like = topic.like + 1
后like的值都为1,提交到数据库后like的值也是1;
使用F对象实现点赞操作:利用mysql的innodb引擎的行锁功能,在进行数据的写入更新时,别人是操作不了数据的,间接性的上了一把锁,防止数据库多事物并发的问题 - 示例3:对数据库中两个字段的值进行比较,列出哪些书的零售价高于定价
#使用F对象实现 from django.db.models import F from bookstore.models import Book books = Book.objects.filter(market_price__gt=F('price')) """等同于sql语句:SELECT * FROM 'bookstore_book' WHERE 'bookstore_book'.'market_price' > ('bookstore_book'.'price')""" for book in books: print(book.title,'定价:',book.price,'现价:',book.market_price)
-
Q对象(或与非)
- 作用:在条件中用来实现逻辑或 | 、逻辑非~、逻辑与&等操作
- 语法:
from django.db.models import Q Q(条件1) | Q(条件2) #条件1或者条件2成立 Q(条件1) & Q(条件2) #条件1和条件2同时成立 Q(条件1) &~ Q(条件2) #条件1成立且条件2不成立
- 示例1:
#过滤出定价低于20元或者清华大学出版社出版的全部书籍 Book.objects.filter(Q(price__lt=20) | Q(pub='清华大学出版社'))