gpt4 book ai didi

python - 结合 Django F、Value 和字典来注释查询集

转载 作者:太空狗 更新时间:2023-10-30 00:38:11 26 4
gpt4 key购买 nike

我有一个场景,我想在一个字典中用外部准备的数据注释一个查询集。我想做如下的事情:

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

最佳答案

到目前为止,我最接近的是循环遍历字典,并根据字典键联合一大堆过滤查询集。像这样:

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 将得到我想要的结果,即基于每个实例注释的字典键的字典值。

这样做的美妙之处在于,只有一次对数据库的调用是在我决定使用 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()
)
)

希望对大家有帮助

关于python - 结合 Django F、Value 和字典来注释查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48186782/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com