2010-11-14 89 views
0

我有兩個型號:Django的管理:創建,保存和與一個M2M模型

class Production(models.Model): 
    gallery = models.ManyToManyField(Gallery) 

class Gallery(models.Model): 
    name = models.CharField() 

我在製作管理的M2M的關係,但我想這些功能,當我創建一個新的生產,將創建一個默認圖庫,並在兩者之間註冊關係。

到目前爲止,我可以通過覆蓋生產創建默認保存到圖庫:

def save(self, force_insert=False, force_update=False): 
    if not (Gallery.objects.filter(name__exact="foo").exists()): 
     g = Gallery(name="foo") 
     g.save() 
     self.gallery.add(g) 

這將創建並保存模型實例(如果它不存在),但我不知道該怎麼註冊兩者之間的關係?

回答

0

您註冊,就像你有關係,通過在Production調用add。問題是,你節省了Gallery,但不是其save你已經覆蓋了Production。您需要在您的save結束調用super(...).save(...)

def save(self, force_insert=False, force_update=False): 
    if not (Gallery.objects.filter(name__exact="foo").exists()): 
     g = Gallery(name="foo") 
     g.save() 
     self.gallery.add(g) 
    super(Production, self).save(force_insert=force_insert, force_update=force_update) 

而且,因爲你有兩個型號在這裏處理,你應該使用Django的信號,對於這一點,可能post-save,這也將給你created標誌:

def create_default_gallery(sender, instance, created, **kwargs): 
    if created and not Gallery.objects.filter(name__exact="foo").exists(): 
     g = Gallery(name="foo") 
     g.save() 
     instance.gallery.add(g) 
models.signals.post_save.connect(create_default_gallery, sender=Production) 

雖然這仍然不會做你說你想要的;如果你真的想爲默認Gallery每一個新Production相關聯,你要做到這一點,即使你沒有創建默認Gallery

def create_default_gallery(sender, instance, created, **kwargs): 
    if created: 
     g = Gallery.objects.get_or_create(name__exact="foo") 
     g.save() 
     instance.gallery.add(g) 
models.signals.post_save.connect(create_default_gallery, sender=Production) 
+0

哎,感謝。不幸的是我仍然有同樣的問題。其實我有超(...)。保存(...)在原來的我忘了,包括它在原崗位。即使使用這些信號;它的創建畫廊的實例,但不將它鏈接到生產。 – 2010-11-15 01:07:25

+0

@pastylegs這是奇怪的;你能手動添加畫廊到外殼中的產品嗎? – eternicode 2010-11-15 02:55:06

相關問題