【问题标题】:Update queryset with dictionary values使用字典值更新查询集
【发布时间】:2021-08-23 02:54:30
【问题描述】:

我正在编写自定义列表过滤器,在过滤器调用内部我有一个 Django 查询集,如下所示

queryset =[qs1, qs2, qs3]

queryset 对 queryset 中的所有对象都有一个属性 Count_val = 0, UUID = (unique id)

这么说

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

感谢您的帮助

【问题讨论】:

  • 你从哪里弄来的字典?如果从另一个查询中,您应该能够使用一些注释来做到这一点。如果没有,你将不得不做一些丑陋的链式注释
  • 不是来自查询
  • 你能给我一个注释的例子,我可以通过它更新 uuid 或关于字典的新字段
  • 添加了一个示例注释作为答案

标签: python django dictionary django-queryset


【解决方案1】:

您可以创建一个When 对象列表,这些对象与字典中的每个键匹配并返回值。然后将此列表解压缩为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)))

【讨论】:

    【解决方案2】:

    让查询集为qs,字典为d

    qs2=qs[:]
    for elem in qs2:
        qs2["count_val"] = d[elem["uuid"]]
    return qs2
    

    【讨论】:

    • qs["count"] 给我 TypeError is not subscriptable
    • 应该是elem.count_val=d[elem["uuid"]]
    • 是的,我的错,我做了同样的事,但没有工作(上面的错字)我只尝试了 element.uuid
    • 它似乎在 CustomFilter 内部进行了更新,但在返回到 AdminManager 后,它为 uuid 字段 def get_uuid(obj) 调用了另一个方法:return obj.uuid
    • 这里 uuid 具有旧值而不是更新值。但是 quere 长度是正确的(我正在改变它)
    猜你喜欢
    • 2020-07-22
    • 2019-12-10
    • 2020-05-03
    • 1970-01-01
    • 2020-07-16
    • 2019-11-10
    • 2015-02-12
    • 2015-11-28
    • 2013-11-01
    相关资源
    最近更新 更多