Django-Admin:创建,保存和关联M2M模型
-
09-10-2019 - |
题
我有两个型号:
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)
这会创建并保存模型实例(如果尚不存在),但是我不知道如何注册两者之间的关系?
解决方案
您与您一样注册关系,致电 add
在 Production
. 。问题是您要保存 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)
不隶属于 StackOverflow