You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django多对多关系查询求助:附模型代码示例

嘿,我来帮你梳理下Django里多对多关系的常用查询操作,结合你给出的Actors和Movies模型,咱们一步步来:

先给你的模型提个小细节:Movies里的casting字段,ManyToManyField的参数直接写"Actors"或者Actors就行,不用写成"models.Actors",不然可能会触发找不到模型的报错哦~

1. 查询某部电影的所有演员

如果已经拿到了具体的电影对象,直接调用关联字段的all()方法就能获取所有演员:

# 通过标题获取目标电影对象
movie = Movies.objects.get(title="复仇者联盟")
# 提取这部电影的全部演员
actors_in_movie = movie.casting.all()
# 遍历输出演员名字
for actor in actors_in_movie:
    print(actor.name)

也可以直接用链式过滤,一步到位拿到符合条件的电影对应的演员:

# 找出所有标题包含"联盟"的电影里的演员
actors = Actors.objects.filter(movies__title__contains="联盟")
2. 查询某个演员参演的所有电影

多对多关系的反向查询默认是模型名小写_set,比如演员对象的movies_set:

# 获取目标演员对象
actor = Actors.objects.get(name="小罗伯特·唐尼")
# 提取他参演的全部电影
movies_of_actor = actor.movies_set.all()
# 遍历输出电影标题
for movie in movies_of_actor:
    print(movie.title)

如果觉得movies_set不够直观,可以在定义ManyToManyField时加上related_name参数,让反向关联更清晰:

# 修改Movies模型的casting字段
casting = models.ManyToManyField(Actors, verbose_name="Actors", related_name="movies")

修改后就可以直接用actor.movies.all()来查询,读起来更顺~

3. 过滤包含特定演员的电影

比如要找出所有有“小罗伯特·唐尼”参演的电影,直接通过关联字段过滤即可:

# 直接通过演员名字过滤
target_movies = Movies.objects.filter(casting__name="小罗伯特·唐尼")

# 或者先拿到演员对象,再用对象过滤(更精确,避免重名问题)
target_actor = Actors.objects.get(name="小罗伯特·唐尼")
target_movies = Movies.objects.filter(casting=target_actor)
4. 过滤参演了某部特定电影的演员

反过来,要找参演了某部电影的所有演员,用反向关联的字段过滤:

# 找参演了"复仇者联盟"的所有演员
target_actors = Actors.objects.filter(movies__title="复仇者联盟")
5. 进阶:多条件组合查询

如果需要更复杂的查询,比如找同时参演了“复仇者联盟”和“钢铁侠”的演员,可以用多次过滤或者Q对象:

# 多次过滤实现多条件交集
actors = Actors.objects.filter(movies__title="复仇者联盟").filter(movies__title="钢铁侠")

# 用Q对象实现更灵活的逻辑(比如交集、并集)
from django.db.models import Q
actors = Actors.objects.filter(Q(movies__title="复仇者联盟") & Q(movies__title="钢铁侠"))

再比如统计参演电影数量≥3的演员,可以用annotate结合Count:

from django.db.models import Count
# 给每个演员添加一个movie_count字段,统计参演电影数,再过滤数量≥3的
actors = Actors.objects.annotate(movie_count=Count("movies")).filter(movie_count__gte=3)

内容的提问来源于stack exchange,提问作者micleb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:11:05