我有一个模型实例,上面有一个布尔字段。我想要实现的是将值从True切换为False,反之亦然。
当然,我可以写:
inst = Model.objects.get(id=1)
inst.boolean_field = not inst.boolean_field
inst.save()
但是有2个查询:一个用于获取,另一个用于更新。
我只想切换值,但以下似乎不起作用:
Model.objects.filter(id=1).update(boolean_field=not F("boolean_field"))
我很确定我做错了什么,或者说这是不可能的。
不幸的是,django尚未支持对F() object
的否定。
当你做not F('boolean_field')
它被评估为True
,所以更新操作总是保存True
。例如
>>> F('boolean_field')
<django.db.models.expressions.F object at 0x36b7d50>
>>> not F('boolean_field')
True
请参阅django 17186 - Inverted F expression (negation)上的这个错误
您可以使用Case
代替:
from django.db.models import Case, Value, When
queryset.update(active=Case(
When(active=True, then=Value(False)),
When(active=False, then=Value(True)),
))