Question

J'ai deux modèles:

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

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

J'ai la relation m2m dans mes productions admin, mais je veux que la fonctionnalité que lorsque je crée une nouvelle production, une galerie par défaut est créé et la relation est enregistrée entre les deux.

Jusqu'à présent, je peux créer la galerie par défaut en remplaçant les productions de sauvegarde:

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)

Cela crée et enregistre l'instance de modèle (si elle n'existe pas déjà), mais je ne sais pas comment enregistrer la relation entre les deux?

Était-ce utile?

La solution

Vous inscrire la relation comme vous avez, en appelant add sur le Production. Le problème est que vous enregistrez le Gallery, mais pas le Production dont vous avez save surchargée. Vous devez appeler super(...).save(...) à la fin de votre 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)

En outre, étant donné que vous avez affaire à deux modèles ici, vous devez utiliser les signaux de Django pour cela, probablement post-sauvegarde , qui vous donnera également le drapeau 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)

Bien que cela va toujours pas faire ce que vous dites que vous voulez; si vous voulez vraiment associer le Gallery par défaut à chaque nouvelle Production, vous aurez envie de le faire même lorsque vous n'êtes pas créer le Gallery par défaut:

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top