2014-11-01 67 views
1

我有一個與目錄模型具有OnetoOne關係的文章模型。Django信號post_save更新

我目前的功能是在post_save上的Article模型中創建一個具有相同名稱的Catalog模型。我想在文章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') 

上面的代碼工作正常。一旦創建Article模型實例,它將創建一個具有相同名稱的Catalog實例。我想現在將新創建的Article與FK關係更新爲新創建的Catalog實例。我認爲我的邏輯很接近,但我無法實現。

@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 2014-11-01 15:05:55

+0

這是有道理的替換第一個post_save,但我認爲附加目錄只能在目錄實例存在 – byrdr 2014-11-01 15:53:42

回答

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')) 
相關問題