2010-11-14 4 views
0

У меня есть две модели:Джанго-администратор: создание, сохранение и соотнесение модели 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) 

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

ответ

0

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

эй, спасибо за это. К сожалению, у меня все еще такая же проблема. У меня на самом деле был супер (...). Save (...) в оригинале я просто забыл включить его в исходный пост. Даже используя сигналы; он создает экземпляр галереи, но не связывает ее с производством. –

+0

@pastylegs это странно; можете ли вы вручную добавить галереи в производство в оболочке? – eternicode

Смежные вопросы