代码之家  ›  专栏  ›  技术社区  ›  RishiG

如何用同一模型上其他布尔场的逻辑组合来更新django布尔场?

  •  1
  • RishiG  · 技术社区  · 6 年前

    考虑一下这个简单的django模型(由Postgres支持):

    class M(Model):
        a = BooleanField(default=False)
        b = BooleanField(default=False)
        c = BooleanField(default=False)
    
        class Meta:
            app_label = 'my_app'
    

    update 设置 c a b ? 我的第一反应是

    M.objects.update(c=F('a') and F('b'))
    

    但显然python是先执行的(使用 F

    UPDATE "my_app_m"
    SET "c" = "my_app_m"."b"
    

    我试着把这个表达式包装起来 ExpressionWrapper * 而不是 and (将F表达式相乘),但这在sql端产生了一个操作错误。

    我知道我可以在python中通过获取对象,操纵它们,然后保存来实现这一点。我猜我也可以通过强制转换为int,然后乘以,再强制转换回来来进行更新。但令我惊讶的是,ORM并不能简单地处理这个问题。有没有一个步骤我遗漏了,或不同的标准方式来实现相同的效果?

    谢谢你的时间!

    2 回复  |  直到 6 年前
        1
  •  1
  •   RishiG    6 年前

    我现在拥有的:

        M.objects.update(
            c=Case(
                When(a=True, b=True, then=Value(True)),
                default=Value(False)
            )
        )
    

        M.objects.update(c=False)
        M.objects.filter(a=True, b=True).update(c=True)
    
        2
  •  0
  •   willeM_ Van Onsem    6 年前

    Q 此处的对象:

    from django.db.models import Q
    
    M.objects.update(c=Q(a=True, b=True))

    UPDATE "my_app_m"
    SET "c" = ("my_app_m"."a" = true AND "my_app_m"."b" = true)