Django:注释三个模型

时间:2018-10-09 08:42:53

标签: python django orm

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

我将尝试简化设置:

我有3个模型:MovieActorCasting

每个Casting都有一个Movie和一个Actor的外键,以及一个CharField的{​​{1}}。

例如,role可能是约翰尼·德普(Johnny Depp)在《加勒比海盗》中扮演杰克·斯派洛(Jack Sparrow)。

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

请注意,我要指定一个特定的演员,但我不想覆盖所有演员。

1 个答案:

答案 0 :(得分:1)

您可以使用.annotate(..)对象Case(..)

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

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

如果角色有多个角色,它将采用字典上最小的角色,如果没有这样的角色,则将占据None