django-admin: создание, сохранение и привязка модели m2m - PullRequest
0 голосов
/ 14 ноября 2010

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

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

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

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

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

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)

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

1 Ответ

0 голосов
/ 14 ноября 2010

Вы регистрируете отношения так же, как и у вас, позвонив 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)

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