Django - 如何比较模型的前/后保存状态,包括所有关系

时间:2012-02-27 23:27:48

标签: django django-models django-admin

我正在尝试在redis中维护一些跟踪django中模型的集合

class Campaign(models.Model):
    advertiser = models.ForeignKey(User)
    name = models.CharField(max_length=200)
    carriers = models.ManyToManyField(Carrier)
    countries = models.ManyToManyField(Country)


@receiver(pre_save, sender=Campaign)
def adserver_clear_cache(sender, **kwargs):
    campaign = kwargs['instance']
    for con in campaign.countries.all():
        r.srem("con:" + str(con.id), campaign.id)
    for car in campaign.carriers.all():
        r.srem("car:" + str(car.id), campaign.id)


@receiver(post_save, sender=Campaign)
def adserver_save_cache(sender, **kwargs):
    campaign = kwargs['instance']
    for con in campaign.countries.all():
        r.sadd("con:" + str(con.id), campaign.id)
    for car in campaign.carriers.all():
        r.sadd("car:" + str(car.id), campaign.id)

问题是,在保存每个运营商,广告系列等之前,广告系列已完全保存。所以我在pre + post_save中获得了相同的数据。有什么方法可以在包括关系完成保存的所有内容之后调用函数吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

问题是在保存模型后,m2m关系会被保存,换句话说,“post_save()对于你所追求的目标来说还是太早了”。

您可以使用m2m_changed信号作为jpic指出,或使用Django 1.4的新“save_related” - https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_related关闭票证16115 https://code.djangoproject.com/ticket/16115

另见https://stackoverflow.com/a/8462541/640759

答案 1 :(得分:0)

ManyToManyField特殊。它不在数据库中由其模型表的列表示。事实上,一个ManyToManyField代表另一个表,用于链接n:m关系两侧的模型。

对于n:m关系的任意一侧发出诸如post_save的模型信号是没有意义的。 当ManyToManyField发生更改时,m2m_changed signal会退出

  

在模型实例上更改ManyToManyField时发送。严格来说,这不是模型信号,因为它是由ManyToManyField发送的,但由于它在跟踪模型的更改时补充了pre_save / post_save和pre_delete / post_delete,因此它包含在此处。