Question

I have two models:

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

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

I have the m2m relationship in my productions admin, but I want that functionality that when I create a new Production, a default gallery is created and the relationship is registered between the two.

So far I can create the default gallery by overwriting the productions 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)

This creates and saves the model instance (if it doesn't already exist), but I don't know how to register the relationship between the two?

Was it helpful?

Solution

You register the relationship just as you have, by calling add on the Production. The problem is that you're saving the Gallery, but not the Production whose save you've overridden. You need to call super(...).save(...) at the end of your 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)

Furthermore, since you're dealing with two models here, you should use Django's signals for this, probably post-save, which will also give you the created flag:

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)

Though this still won't do what you say you want; if you really want to associate the default Gallery with every new Production, you'll want to do it even when you're not creating the 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)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top