使用Django中的update方法切换布尔字段的值

问题描述 投票:2回答: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"))

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

django models
2个回答
5
投票

不幸的是,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)上的这个错误


1
投票

您可以使用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)),
))
© www.soinside.com 2019 - 2024. All rights reserved.