django-admin: создание, сохранение и связывание модели m2m

У меня есть две модели:

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

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

У меня есть отношения m2m в моем администраторе производства, но я хочу, чтобы при создании нового производства создавалась галерея по умолчанию, и отношения регистрировались между ними.

Пока я могу создать галерею по умолчанию, перезаписав сохранение продукции:

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)

Это создает и сохраняет экземпляр модели (если он еще не существует), но я не знаю, как зарегистрировать отношения между ними?


person Timmy O'Mahony    schedule 14.11.2010    source источник


Ответы (1)


Вы регистрируете отношения так же, как и раньше, позвонив add на Production. Проблема в том, что вы сохраняете Gallery, но не Production, save которого вы переопределили. Вам нужно позвонить super(...).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)

Кроме того, поскольку здесь вы имеете дело с двумя моделями, вам следует использовать для этого сигналы Django, возможно, post-save, что также даст вам флаг 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)

Хотя это по-прежнему не будет делать то, что вы говорите, что хотите; если вы действительно хотите связать Gallery по умолчанию с каждым новым Production, вы захотите сделать это, даже если вы не создаете 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)
person eternicode    schedule 14.11.2010
comment
эй, спасибо за это. К сожалению, у меня все еще та же проблема. На самом деле у меня было super(...).save(...) в оригинале, я просто забыл включить его в исходный пост. Даже используя сигналы; он создает экземпляр галереи, но не связывает его с производством. - person Timmy O'Mahony; 15.11.2010
comment
@pastylegs это странно; вы можете вручную добавить галереи в производство в оболочке? - person eternicode; 15.11.2010