我有一个场景,我想在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
答案 0 :(得分:5)
我到目前为止最接近的是循环遍历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的时候,除此之外,整个过程并没有触及我理解的数据库。
还不确定是否有更好的方法,但在接受此方法之前会等待查看是否有其他回复。
以下新改进的工作方法
遗憾的是,由于此问题,上述版本不适用于当前版本的Django版本1.11中的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()
)
)
希望它有助于某人