[英]Combining Django F, Value and a dict to annotate a queryset
我有一个场景,我想在dict中使用外部准备的数据来注释查询集。 我想做类似以下的事情:
value_dict = {"model1": 123.4, "model2": 567.8}
qs = ModelClass.objects.annotate(
value=Value(value_dict.get(F('model__code'), 0))
)
结果当前显示为0,因为F()似乎不是查找字典的最佳方式,因为它不返回字符串并且它在轨道上进一步解析。
非常感谢您的帮助和建议
我目前使用的是Python 3.6和Django 1.11
到目前为止,我最接近的是循环遍历dict并根据dict键联合一大堆过滤的查询集。 像这样:
value_dict = {"model1": 123.4, "model2": 567.8}
array_of_qs = []
for k, v in value_dict.items():
array_of_qs.append(
ModelClass.objects.filter(model__code=k).annotate(value=Value(v))
)
qs = array_of_qs[0].union(*array_of_qs[1:])
然后qs将得到我想要的结果,这是基于每个实例注释的dict键的dict值。
这样做的好处是只有一次调用db,这是我决定使用qs时,除此之外,整个过程不会触及我理解的数据库。
不确定还有更好的方法,但在接受这个之前会等待看看是否还有其他回复。
以下新改进的工作方法
遗憾的是,由于此问题,上述版本无法使用当前版本1.11的Django中的values_list或值: https ://code.djangoproject.com/ticket/28900
我在下面设计了一个更清洁的方式:
value_dict = {"model1": 123.4, "model2": 567.8}
whens = [
When(model__code=k, then=v) for k, v in value_dict.items()
]
qs = ModelClass.objects.all().annotate(
value=Case(
*whens,
default=0,
output_field=DecimalField()
)
)
希望它可以帮助某人
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.