0

私は2つのモデルを持っています:

class Production(models.Model):
    gallery = models.ManyToManyField(Gallery)

class Gallery(models.Model):
    name = models.CharField()

プロダクション管理者に 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 つの間の関係を登録する方法がわかりません。

4

1 に答える 1

0

addを呼び出すことで、今までと同じように関係を登録しますProduction。問題は、 を保存しているが、オーバーライドしたを保存してGalleryいないことです。あなたの最後に呼び出す必要があります:Productionsavesuper(...).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 のシグナル (おそらくpost-savecreated ) を使用する必要があります。これにより、フラグも表示されます。

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)

これはまだあなたが望むことをしませんが。Gallerydefaultをすべての new に本当に関連付けたい場合はProduction、 default を作成していないときでもそれを行う必要があります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)
于 2010-11-14T16:48:45.177 に答える