首页 > 解决方案 > 使用桥接表的多对多关系的 Django QuerySet

问题描述

我是 Django 新手,正在寻找一种使用中间表检索和发布到多对多关系的有效方法。

楷模:

from django.db import models

# Create your models here.
class Actor(models.Model):
    name = models.CharField(max_length = 50, primary_key = True)
    bio = models.CharField(max_length=150)

class Movie(models.Model):
    name = models.CharField(max_length=100)
    release = models.CharField(max_length=100)

class NormActors(models.Model):
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
    actor = models.ForeignKey(Actor, on_delete=models.CASCADE)

我已经检查了文档并且它变得混乱,所以任何参考都会有所帮助。如果应要求,我想发送 -

  1. for /movies:获取所有电影的列表 + 包含相应电影中演员姓名的详细信息
  2. for /actors:获取所有演员的列表+他们参加过的电影的详细信息

ORM 查询应该是这样的吗?

actor = Actor.objects.get(name="XYZ")
movies = actor.movie_set.all()

我应该如何处理第一个?

标签: djangoorm

解决方案


首先,您应该显式声明 m2m 并如下标识直通表:

class Movie(models.Model):
    ...
    actors = models.ManyToManyField('Actor', through='NormActor')

现在,你可以拍任何电影,也可以拍movie.actors.all()任何演员actor.movie_set.all()

请注意,如果您在 NormActor 上只有这两个字段,则实际上不需要显式声明它;您可以删除该模型和through属性,Django 将为您管理它,另外还有一个好处是在管理界面中您现在可以编辑与电影内联的演员。


推荐阅读