F对象与Q对象学习笔记

本文详细介绍了Django ORM中的F对象和Q对象的使用。F对象允许在不查询数据库的情况下更新字段,避免了多次数据库交互,如示例中所示,可用于批量价格上涨。Q对象则提供了逻辑操作符,如或(|)、与(&)、非(~),方便构建复杂的查询条件,例如筛选定价低于20元或由清华大学出版社出版的书籍。通过F对象和Q对象,开发者可以更高效地处理数据库操作,提高并发安全性并减少不必要的数据读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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() # 保存
      
      #使用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()
      
      使用常规方法实现点赞:假设同时有一万条点赞数据进行并行处理,这一万条数据的topic.like查询到的like值都为0,执行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='清华大学出版社'))
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值