2010-11-14 92 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