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')