2010-04-20 43 views
0

我的问题与as this question几乎相同,只是所有关系都应该是多对多关系。如何在模型(Django)中描述m2m三连接表

我有以下类在我的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 
) 


  • John Doe - 导演,作家,制作人
  • 李四 - 执行制片人
  • ...

这是我到目前为止已经使用:

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


但是,是不是有这样做的什么更好的办法,而不是涉及在模型中创建一个单独的类?

+1

这是标准的解决方案。你认为什么是错的?请详细说明你不喜欢的事情。 – 2010-04-20 11:52:28

+0

这不是我认为它有什么问题。我只是认为会有另一种方式可以给我一些免费的功能,比如标准的ManyToManyField。 – jmagnusson 2010-04-20 13:39:04

+0

它不是**简单的多对多。这是一个罕见的例外情况。 – 2010-04-22 14:44:47

回答

0

分离两个m2m关系怎么样?

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() 
+0

如何才能为每个媒体上传的每个配置文件分配多个角色?我很困惑 – jmagnusson 2010-04-20 20:02:45

+0

@Saosin,听起来好像你需要'Profile'和'Media'之间的m2m关系,并且对于每一种关系都有很多'Roles'。如果是这样,你可以尝试创建一个'Profile'和'Media'关联表,然后使'roles'成为一个外键。 – satoru 2010-04-20 23:53:53

+0

使用带有'through'的中间模型,如下所示:http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships?由于可能只有两个外键 - 一个指向源模型,另一个指向无法工作。或者我误解了文档? – jmagnusson 2010-04-21 13:03:06