[英]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.