我有两个型号:

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)

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

有帮助吗?

解决方案

您与您一样注册关系,致电 addProduction. 。问题是您要保存 Gallery, ,但不是 Production 谁的 save 你已经覆盖了。你需要打电话 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的信号,可能 后保存, ,这也会给你 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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top