1.F对象
一个F对象代表数据库中某条记录的字段的信息。
作用:
通常是对数据库中的字段的值在不获取的情况下进行操作
用于类属性(字段)之间的比较。
语法:
From django.db.models import F
F(‘列名’)
例子:
所有Book数据表中的price涨价1元或降价一元。
Book.objects.all().update(price=F(‘price’)+1)
Book.objects.all().update(price=F(‘price’)-1)
F对象能够很好的解决并发情况下对数据加锁的问题。
例如对于账户余额的修改问题。
单线操作的情况下,
User = User.objects.get(id=1)
User.balance = User.balance + 100
User.save()
但是如果用户id=1在多个银行同时存款时,会导致在get时他们的数据在分布式环境中是相同的,这就导致我们需要把这个余额变化的代码看成是一个整体。就需要F对象的帮助。也就是
User = User.objects.get(id=1)
User.balance = F(‘Balance’) + 100
User.save()
通过F对象的帮助,我们能够较好的解决并发情况下的冲突问题。
或者,利用F对象,可以查找在Book表中,price大于id的情况。
2.Q对象
由于filter方法只能实现and的逻辑运算
当在获取查询结果集使用逻辑或|或者是逻辑非~等操作时,可以使用Q对象进行操作。
例如,找出所有定价高于20元或id大于3的书,可以写成:
Book.objects.filter(Q(price__gt=20) | Q(id__gt=3))
除了或操作符 | ,还有& 与操作符、~非操作符。