2010-04-20 58 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