Pregunta

Tengo dos modelos:

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

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

Tengo la relación M2M en mi producciones de administración, pero quiero que la funcionalidad que cuando se crea una nueva producción, se crea una galería por defecto y la relación se ha registrado entre los dos.

Hasta ahora puedo crear la galería por defecto al sobrescribir las producciones Guardar:

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)

Esto crea y guarda la instancia del modelo (si no existe), pero no sé cómo registrar la relación entre los dos?

¿Fue útil?

Solución

registrar la relación igual que usted tiene, llamando add en el Production. El problema es que usted está ahorrando el Gallery, pero no el Production cuya save se ha redefinido. Es necesario que super(...).save(...) llamada al final de su 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)

Además, puesto que está tratando con dos modelos aquí, se debe utilizar señales de Django para esto, probablemente Guardar post-, que también le dará la bandera 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)

A pesar de esto todavía no va a hacer lo que usted dice que quiere; si realmente desea asociar el Gallery defecto con cada nuevo Production, usted querrá hacerlo incluso cuando no se está creando la Gallery por defecto:

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top