我有两种模式:
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 :(得分: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)