如何在模型中描述m2m三表连接(Django)

0 投票
1 回答
549 浏览
提问于 2025-04-15 21:49

我的问题跟这个问题差不多,只不过我想要的关系都是多对多的。

在我的models.py里有以下这些类(稍微简化了一下):

class Profile(models.Model):
    # Extending the built in User model  
    user = models.ForeignKey(User, unique=True)  
    birthday = models.DateField()

class Media(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(max_length=2000)

class Role(models.Model):
    name = models.CharField(max_length=50)


我想要一个看起来像这样的连接表:

CREATE TABLE `media_roles` (
    `media_id` bigint(20) unsigned NOT NULL,
    `profile_id` bigint(20) unsigned NOT NULL,
    `role_id` bigint(20) unsigned NOT NULL
)


  • 约翰·多 - 导演、编剧、制片人
  • 简·多 - 执行制片人
  • ...

到目前为止,我用的是这些:

class MediaRole(models.Model):
    media = models.ForeignKey(Media)
    user = models.ForeignKey(Profile)
    role = models.ForeignKey(Role)


但是有没有更好的方法,不用在模型里创建一个单独的类呢?

1 个回答

0

那分开这两个多对多关系怎么样呢?

class Profile(models.Model):
    ...
    medias = models.ManyToManyField(Media, related_name='profiles')
    roles = models.ManyToManyField(Role, related_name='profiles')

这样一来,Django会为你创建两个关联表,你就可以像这样方便地使用相关字段:

profile = Profile.objects.get(user=someone)
print profile.medias.all()
print profile.roles.all()

撰写回答