使用字典值更新查询集
Update queryset with dictionary values
我正在编写自定义列表过滤器和内部过滤器调用我有一个 Django 查询集,如下所示
查询集=[qs1, qs2, qs3]
queryset 有一个属性 Count_val = 0, UUID = (unique id) for all objects in queryset
这么说
qs1 = {uuid: 123, count_val: 0}
qs2 = {uuid: 456, count_val: 0}
qs1 = {uuid: 789, count_val: 0}
还有
我有一个 字典,例如 {uuid: count_val}
示例 {123:5, 456:10, 789:15}
我想在返回查询集作为响应之前更新所有对象的查询集属性count_values
也许注释但是我如何为每个值提取每个 uuid
queryset=queryset.annotate(count_val = Case(When(uuid_in=dictionary.keys(), then=dictionary[uuid]), field_type=Integer)) ## not correct syntax just an example
# inserting to new field is also fine
#queryset.extra(value={count_val : dictionary[uuid]})
return queryset
感谢帮助
设查询集为qs
,字典为d
qs2=qs[:]
for elem in qs2:
qs2["count_val"] = d[elem["uuid"]]
return qs2
您可以创建一个 When
对象列表,这些对象匹配字典中的每个键和 return 值。然后将此列表解压缩为 Case
对象
的位置参数
from django.db.models import Case, When, Value, IntegerField
whens = [When(uuid=k, then=Value(v)) for k, v in dictionary.items()]
queryset = queryset.annotate(count_val=Case(*whens, output_field=IntegerField(), default=Value(0)))
我正在编写自定义列表过滤器和内部过滤器调用我有一个 Django 查询集,如下所示
查询集=[qs1, qs2, qs3]
queryset 有一个属性 Count_val = 0, UUID = (unique id) for all objects in queryset
这么说
qs1 = {uuid: 123, count_val: 0}
qs2 = {uuid: 456, count_val: 0}
qs1 = {uuid: 789, count_val: 0}
还有
我有一个 字典,例如 {uuid: count_val}
示例 {123:5, 456:10, 789:15}
我想在返回查询集作为响应之前更新所有对象的查询集属性count_values
也许注释但是我如何为每个值提取每个 uuid
queryset=queryset.annotate(count_val = Case(When(uuid_in=dictionary.keys(), then=dictionary[uuid]), field_type=Integer)) ## not correct syntax just an example
# inserting to new field is also fine
#queryset.extra(value={count_val : dictionary[uuid]})
return queryset
感谢帮助
设查询集为qs
,字典为d
qs2=qs[:]
for elem in qs2:
qs2["count_val"] = d[elem["uuid"]]
return qs2
您可以创建一个 When
对象列表,这些对象匹配字典中的每个键和 return 值。然后将此列表解压缩为 Case
对象
from django.db.models import Case, When, Value, IntegerField
whens = [When(uuid=k, then=Value(v)) for k, v in dictionary.items()]
queryset = queryset.annotate(count_val=Case(*whens, output_field=IntegerField(), default=Value(0)))