2014-11-01 4 views
1

У меня есть модель статьи, которая имеет отношения OnetoOne с моделью каталога.Сообщение Django post_save update

Моя текущая функциональность имеет модель статьи, на post_save, создает модель каталога с тем же именем. Я хотел бы сделать еще немного функциональности, когда статья FK переходит от нулевого значения к обновлению к теперь доступному экземпляру каталога с тем же именем.

Вот то, что я до сих пор:

class Catalog(models.Model): 
    name = models.CharField(max_length=100) 
    price = models.IntegerField() 

    def __unicode__(self): 
     return self.name 

class Article(models.Model): 
    catalog = models.OneToOneField(Catalog, related_name='article_products', blank=True, null=True) 
    title = models.CharField(max_length=200) 

    def __unicode__(self): 
     return unicode(self.title) 

@receiver(post_save, sender=Article) 
def create_catalog(sender, **kwargs): 
    if kwargs.get('created', False): 
     Catalog.objects.get_or_create(name=kwargs.get('instance'), price='10') 

Приведенный выше код работает правильно. После создания экземпляра модели статьи создается экземпляр каталога с тем же именем. Я хотел бы обновить недавно созданную статью с привязкой FK к только что созданному экземпляру Каталога. Я думаю, что моя логика ниже, но я не могу заставить ее работать.

@receiver(post_save, sender=Catalog) 
def attach_catalog(sender, **kwargs): 
    if kwargs.get('created', False): 
     Article.objects.latest('id').update(catalog=kwargs.get('instance')) 
+0

Почему не отменяет статью 'save' метод вместо использования сигналов? Поскольку связанный каталог автоматически генерируется для новых статей, вы можете создать новый каталог в методе переопределенного сохранения и одновременно установить связь. – Fiver

+0

Это имеет смысл для замены первого post_save, но я думаю, что привязка каталога может быть выполнена только после того, как экземпляр каталога существует – byrdr

ответ

5

Я был в состоянии заставить его работать со следующим:

@receiver(post_save, sender=Catalog) 
def attach_catalog(sender, **kwargs): 
    if kwargs.get('created', False): 
     b = Article.objects.latest('id') 
     Article.objects.filter(pk=b.id).update(catalog=kwargs.get('instance'))