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

PostgreSQL多对多关系下Django如何获取单部电影的关键词

解决方法:通过Django模型关联获取电影的关键词

因为你的数据库已经有现成的多对多中间表movies_keywords,我们可以直接在Movies模型中添加关联字段,或者通过原生关联查询来快速获取单部电影的所有关键词,不用手动去处理中间表的复杂关联。

方案一:更新模型,通过ORM直接访问(推荐)

在Movies模型里添加ManyToManyField,指定使用已有的中间表MoviesKeywords,这样就能通过ORM直接调用关联属性:

class Movies(models.Model):
    title = models.CharField(max_length=30, blank=True, null=True)
    # ... 保留你已有的其他字段 ...
    director_name = models.CharField(max_length=30, blank=True, null=True)
    
    # 新增多对多关联字段,绑定到Keywords模型,复用现有中间表
    keywords = models.ManyToManyField(
        Keywords,
        through='MoviesKeywords',
        related_name='related_movies',  # 可选,方便从关键词反向查找关联电影
        blank=True
    )

    class Meta:
        managed = False
        db_table = 'movies'

这里through='MoviesKeywords'的作用是告诉Django:我们用已有的中间表来维护这个多对多关系,不会修改你的数据库结构(因为模型都是managed=False),只是提供ORM层面的便捷访问。

如何使用这个关联

假设你已经拿到了目标电影的实例,比如通过ID查询:

# 获取指定ID的电影实例
target_movie = Movies.objects.get(id=123)

# 方式1:获取所有关键词对象
all_keyword_objects = target_movie.keywords.all()

# 方式2:直接提取关键词名称列表(更常用)
keyword_names = [kw.keyword for kw in target_movie.keywords.all()]
# 或者用values_list更高效
keyword_names = list(target_movie.keywords.values_list('keyword', flat=True))

方案二:不修改模型,直接查询中间表

如果你不想改动现有模型,也可以通过Django的关联查询语法,直接通过中间表过滤:

# 查询ID为123的电影对应的所有关键词名称
keyword_names = Keywords.objects.filter(
    movieskeywords__movie__id=123
).values_list('keyword', flat=True)

# 转换为Python列表
keyword_names_list = list(keyword_names)

这里的movieskeywords是MoviesKeywords模型的小写名称,通过它完成从关键词到中间表再到目标电影的关联过滤。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:28:01