使用字典值更新查询集

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)))