首页 > 解决方案 > Django:跨三个模型进行注释

问题描述

我想对annotatea 进行复杂的调用,但QuerySet我不知道如何构建它。你能帮忙吗?

我将尝试简化我的设置:

我有 3 个模型MovieActorCasting

每个Casting都有一个外键 aMovie和 anActor和一个CharFieldfor role

例如,Casting可以是约翰尼德普在加勒比海盗中扮演杰克斯派洛。

我想要一份电影列表,每部电影都会有一个注释,说明约翰尼·德普在该电影中扮演的角色。如果他没有在那部电影中演出,那应该是None

请注意,我给出的是特定的演员,我不想遍历所有演员。

标签: pythondjangoorm

解决方案


你可以.annotate(..)用一个Case(..)对象:

Movie.objects.annotate(
    role=Min(Case(
        When(casting__actor=my_actor, then=F('casting__role')),
        default=None
    ))
)

现在Movie对象将具有一个属性,该属性.role包含该role参与者的 。

如果演员有多个角色,它将采用字典顺序最小的一个,如果没有这样的演员,它将采用None.


推荐阅读