【问题标题】:Django signal post_save updateDjango 信号 post_save 更新
【发布时间】:2014-11-01 14:38:14
【问题描述】:

我有一个 Article 模型,它与 Catalog 模型具有 OnetoOne 关系。

我当前的功能有文章模型,在 post_save 上,创建一个具有相同名称的目录模型。我想做另一个功能,让 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')

以上代码工作正常。创建 Article 模型实例后,它会创建一个同名的 Catalog 实例。我现在想将具有 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'))

【问题讨论】:

  • 为什么不重写文章save 方法而不是使用信号?由于相关目录是为新文章自动生成的,因此您可以在覆盖的保存方法中创建新目录并同时填充关系。
  • 这对于替换第一个 post_save 是有意义的,但我认为只有在目录实例存在后才能附加目录

标签: django django-models django-signals


【解决方案1】:

我能够通过以下方式让它工作:

@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'))

【讨论】:

  • 这对更新不起作用,post_save 仅在模型创建后触发
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2014-12-18
  • 1970-01-01
  • 2012-05-31
  • 2012-10-12
  • 2017-10-10
相关资源
最近更新 更多