Django-Admin: Создание, сохранение и связь модели M2M
-
09-10-2019 - |
Вопрос
У меня есть две модели:
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)