【问题标题】:Switching value of boolean field with update method in Django在Django中使用更新方法切换布尔字段的值
【发布时间】:2012-08-05 22:27:06
【问题描述】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以改用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)),
      ))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 2018-05-16
        • 2017-09-27
        相关资源
        最近更新 更多