django-admin:创建,保存和关联m2m模型

时间:2010-11-14 14:48:00

标签: django django-models django-admin manytomanyfield 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)

这创建并保存模型实例(如果它还不存在),但我不知道如何注册两者之间的关系?

1 个答案:

答案 0 :(得分:0)

您可以通过调用add上的Production来注册您的关系。问题是您要保存Gallery,而不是Production您已覆盖save的{​​{1}}。您需要在super(...).save(...)

的末尾致电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)