【发布时间】: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