2014-11-01 71 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')) 
相关问题