繁体   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