Django信号post_save更新

byr*_*rdr 1 django django-signals django-models

我有一个与Catalog模型具有OnetoOne关系的Article模型.

我当前的功能有Article模型,在post_save上创建一个具有相同名称的Catalog模型.我想做另一个功能,其中Article FK从null变为更新到现在可用的同名Catalog实例.

这是我到目前为止:

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')
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常.创建Article模型实例后,它将创建同名的Catalog实例.我现在想要将新创建的文章与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'))
Run Code Online (Sandbox Code Playgroud)

byr*_*rdr 7

我能够使用以下内容:

@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'))
Run Code Online (Sandbox Code Playgroud)