Python 计算布尔表达式并注释结果

Python 计算布尔表达式并注释结果,python,django,postgresql,Python,Django,Postgresql,假设我有一个模型: class Measurement(models.Model): measurements = JSONField( null=True, blank=True, help_text="Key value pairs for measurements." ) timestamp = models.DateTimeField(auto_now_add=True) class Meta: ge

假设我有一个模型:

class Measurement(models.Model):
    measurements = JSONField(
        null=True, blank=True, help_text="Key value pairs for measurements."
    )

    timestamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        get_latest_by = "timestamp"
测量值中的值
是具有布尔值的键值对的可变数量,但值也可以为空。例如:

{
    "a": true,
    "b": false, // optional
    "c": null // optional
    //etc...can be infinite amount of values.
}
我需要能够和他们在一起。例如:

{
    "a": true,
    "b": false, // optional
    "c": null // optional
    //etc...can be infinite amount of values.
}
result\u expression=F(“测量值a”)&F(“测量值b”)&F(“测量值c”)&F(“测量值…”)

显然,这是行不通的

还有,我怎样才能对结果进行注释?
Measurement.objects.annotate(result=result\u expression)。值(“result”)

其中,由于空值和假值,此处的结果应为
False


我该怎么做呢?我知道我完全可以用Python来实现这一点。我宁愿不那样做。如果有Postgres或Django的方法,我宁愿这样做。

您可以通过以下方法检查这三个值是否为
True

Measurement.objects.annotate(
    measurements__a=True,
    measurements__b=True,
    measurements__c=True
).values('result')
对于数量可变的键,我们可以使用字典解包:

从django.db.models导入布尔字段、大小写、值
项目=['a','b','c']
测量.对象.注释(
结果=案例(
什么时候(
**{f'measurements_{k}”:对于项目}中的k为真,
值=值(真)
),
默认值=值(假),
输出_字段=布尔字段()
)

).values('result')
我真不敢相信我没有想到这一点。谢谢你好我现在想起来为什么我没有这么做。
measurements
字段中的键值对数量可变。@Mikko:您可以使用字典解包来完成此操作,请参见编辑。
from django.db.models import BooleanField, Case, Value, When

items = ['a', 'b', 'c']

Measurement.objects.annotate(
    result=Case(
        When(
            **{f'measurements__{k}': True for k in items },
            value=Value(True)
        ),
        default=Value(False),
        output_field=BooleanField()
    )
).values('result')