Django ORM中的F表达式逻辑或(Logical OR)

5

我有一个类似于以下的查询:

User.objects.annotate(
    x=Value(False, output_field=BooleanField()),
    y=Value(True, output_field=BooleanField())
).annotate(
    z=F('x').bitor(F('y'))  # HOW TO DO THIS?
).values('z')

这段代码可以运行在SQLite数据库上,但无法在PostgreSQL上运行。出现了以下错误:

LINE 1: SELECT (false | true) AS "z" FROM "auth_user"  LIMIT 21
                      ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

如何在注释字段上实现逻辑或(OR)运算符以保持一致性?

谢谢。

2个回答

4
Expression对象的逻辑运算符,但在框架内部,ValueF都继承自Combinable类。这个类实际上为我们提供了可用的运算符,但不幸的是没有布尔运算符。

如果我们的两个值都可以解析为表达式(Values可以),我们可以将运算符自己传递到数据库中。为此,我们将执行与Combinable相同的操作-初始化CombinedExpression对象:

User.objects.annotate(
        x=Value(False, output_field=BooleanField()),
        y=Value(True, output_field=BooleanField())
    ).annotate(
        z=CombinedExpression(lhs=F('x'), rhs=F('y'), connector="OR")
    ).values('z')

这个解决方案可能不符合所有数据库的要求,但它可以在PostgreSQL中使用。


2

当使用按位运算符时,将其转换为整数类型

from django.db.models.functions import Cast

User.objects.annotate(
    x=Value(False, output_field=BooleanField()),
    y=Value(True, output_field=BooleanField())
).annotate(
    z=Cast(Cast(F('x'), IntergerField()).bitor(Cast(F('y'), IntergerField())), BooleanField())
).values('z')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接