2011-11-10 35 views
2

如何在這裏創建MyListAssoc中的關聯? 我將如何刪除它?django多對多協會

class Group(models.Model): 
    name = models.CharField(max_length=32, unique=True) 
    def __unicode__(self): 
     return '%s %s' % (self.name) 

class MyKeywords(models.Model): 
    name = models.CharField(max_length=32, unique=True) 
    def __unicode__(self): 
     return self.name 

class MyListAssoc(models.Model):  
    group = models.ForeignKey(Group) 
    keyword = models.ManyToManyField(MyKeywords) 

mygroup = Group.objects.get(name="mygroup") 
mykeyword = MyKeywords.objects.create(name="mykeyword") 
+0

你在做什麼沒有多大意義。你想讓一個組擁有不同的關鍵字(外鍵)?或一個組有不同的關鍵字和關鍵字屬於不同的組(多對多)? – juliomalegria

+0

每個組都可以有一個不同的關鍵字列表,每個關鍵字可以屬於不同的組 – user391986

+0

好吧,所以你只需要一個m2m關係,沒有'MyListAssoc',看我的帖子 – juliomalegria

回答

3

你只需要一個多對多的關係,是這樣的:

class Group(models.Model): 
    name = models.CharField(max_length=32, unique=True) 
    keywords = models.ManyToManyField(MyKeywords) 

    def __unicode__(self): 
     return '%s' % (self.name) 

class MyKeywords(models.Model): 
    name = models.CharField(max_length=32, unique=True) 

    def __unicode__(self): 
      return self.name 

然後,你可以用你的M2M關係:

group = Group.objects.get(name='something') 
keyw = MyKeywords.objects.get(name='something_else') 
group.keywords.add(keyw) 
group.keywords.all() 
group.keywords.remove(keyw) 

注意:建議的名稱一類是單數,所以它應該是MyKeyword而不是MyKeywords

+0

性能會受到這個影響,因爲我的Group類實際上比im更多地顯示在這裏 – user391986

+0

@ user391986,沒有這是唯一正確的方法,請閱讀有關Django ORM的更多信息。 ManyToManyField會創建一個特殊的數據庫表來映射這些關係。 –

+0

我非常感謝非常感謝! – user391986

2
mygroup = Group.objects.get(name="mygroup") 
mykeyword = MyKeywords.objects.create(name="mykeyword") 

mylistassoc = MyListAssoc(group=mygroup) 
mylistassoc.save() 
mylistassoc.keyword.add(mykeyword) 

如果你想取消關聯,只是用remove(mykeyword),而不是add(mykeyword)

但是,根本不需要中介模型來設置組和關鍵字之間的關係。

+0

我不明白,它告訴我'''關鍵字'是此函數的無效關鍵字參數「 – user391986

+0

噢,對不起,這是m2m,我馬上修復它。 –

+0

創建你的模型,像@ julio-alegria [推薦](http://stackoverflow.com/questions/8075042/django-many-to-many-association/8075072#answer-8075175)。 –