Django-Admin:M2Mモデルの作成、保存、関連付け
-
09-10-2019 - |
質問
2つのモデルがあります。
class Production(models.Model):
gallery = models.ManyToManyField(Gallery)
class Gallery(models.Model):
name = models.CharField()
Productions管理者にはM2M関係がありますが、新しいプロダクションを作成すると、デフォルトのギャラリーが作成され、2つの間に関係が登録されている機能が必要です。
これまでのところ、プロダクションの保存を上書きすることで、デフォルトのギャラリーを作成できます。
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)
これにより、モデルインスタンスが作成されて保存されます(まだ存在していない場合)が、2つの関係を登録する方法がわかりませんか?
解決
あなたはあなたが持っているように、電話をかけることによって関係を登録します 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)
さらに、ここで2つのモデルを扱っているので、おそらくこれには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