gpt4 book ai didi

django - 如何使用同一模型上其他 BooleanField 的逻辑组合更新 django BooleanField?

转载 作者:行者123 更新时间:2023-11-29 13:12:26 31 4
gpt4 key购买 nike

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

class M(Model):
a = BooleanField(default=False)
b = BooleanField(default=False)
c = BooleanField(default=False)

class Meta:
app_label = 'my_app'

如何使用 updatec 的值设置为 ab 的逻辑与?我的第一直觉是

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

但显然 python 首先执行(F 函数的逻辑与简单地返回第二个方法),因为这会产生以下 SQL:

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

我尝试在 ExpressionWrapper 中包装表达式,但这没有效果。我也尝试使用 * 而不是 and (乘以 F 表达式),但这会在 sql 端产生操作错误。

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

感谢您的宝贵时间!

最佳答案

经过一番摸索,我找到了这个解决方案。不太喜欢回答我自己的问题,但这让我很烦恼,所以也许它会对其他人有所帮助。我不确定这是否是最好或最直接的解决方案,所以希望其他人能提出更好的答案,我可以接受。

我现在拥有的:

    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)

关于django - 如何使用同一模型上其他 BooleanField 的逻辑组合更新 django BooleanField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53232474/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com