django-admin: crear, guardar y relacionar un modelo M2M
-
09-10-2019 - |
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?
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)