2

我有一个模型实例,上面有一个布尔字段。我想要实现的是将值从 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"))

我很确定我做错了什么,或者这是不可能的。

4

2 回答 2

5

不幸的F() object是,django 还不支持否定 of 。

当你这样做时not F('boolean_field'),它被评估为True,所以更新操作总是保存True。例如

>>> F('boolean_field')
<django.db.models.expressions.F object at 0x36b7d50>
>>> not F('boolean_field')
True

请参阅 django 17186 上的此错误 - 反转 F 表达式(否定)

于 2012-08-06T08:29:28.390 回答
3

您可以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)),
))
于 2018-03-02T10:00:43.827 回答