【问题标题】:Django annotate field value from external dictionaryDjango 注释来自外部字典的字段值
【发布时间】:2022-12-31 22:04:51
【问题描述】:

可以说我有以下命令:

schools_dict = {
   '1': {'points': 10},
   '2': {'points': 14},
   '3': {'points': 5},
}

我如何使用注释将这些值放入我的查询集中? 我想这样做,但它不起作用

schools = SchoolsExam.objects.all()
queryset = schools.annotate(
    total_point = schools_dict[F('school__school_id')]['points']
)

楷模:

class SchoolsExam(Model):
    school = ForeignKey('School', on_delete=models.CASCADE),

class School(Model):
    school_id = CharField(),

这段代码给我一个错误KeyError: F(school__school_id)

【问题讨论】:

    标签: python django django-orm keyerror django-annotate


    【解决方案1】:

    您不能在查找中使用 F 对象,因为字典不“理解”F-对象。

    您可以将其翻译成conditional expression [Django-doc]

    from django.db.models import Case, Value, When
    
    schools = SchoolsExam.objects.annotate(
        total_point=Case(
            *[
                When(school__school_id=school_id, then=Value(v['points']))
                for school_id, v in school_dict.items()
            ]
        )
    )

    因此,这会将字典“展开”为CASE WHEN school_id=1 THEN 10 WHEN school_id=2 THEN 14 WHEN school_id=3 THEN 5

    然而,使用字典中的数据通常没有多大意义:通常将其存储在表中并执行 JOIN。

    【讨论】:

    • 非常感谢,我被这个任务卡住了大约 2 天,你救了我的命!上帝祝福你!
    猜你喜欢
    • 2021-01-31
    • 2021-03-08
    • 2019-01-22
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多