簡體   English   中英

結合Django F,Value和dict來注釋查詢集

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM