Вопрос

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

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)

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

Это было полезно?

Решение

Вы регистрируете отношения так же, как вы имеете, позвонив 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 для этого, возможно, постсохранить, что также даст вам 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top