我想通过annotate
进行复杂的QuerySet
调用,但我不知道如何构建它。你能帮忙吗?
我将尝试简化设置:
我有3个模型:Movie
,Actor
和Casting
。
每个Casting
都有一个Movie
和一个Actor
的外键,以及一个CharField
的{{1}}。
例如,role
可能是约翰尼·德普(Johnny Depp)在《加勒比海盗》中扮演杰克·斯派洛(Jack Sparrow)。
我想获取电影列表,每部电影都会有一个注释,说明约翰尼·德普在该电影中扮演的角色。如果他没有参加那部电影,那就应该是Casting
。
请注意,我要指定一个特定的演员,但我不想覆盖所有演员。
答案 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
。