我正在尝试在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中获得了相同的数据。有什么方法可以在包括关系完成保存的所有内容之后调用函数吗?
谢谢!
答案 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
答案 1 :(得分:0)
ManyToManyField特殊。它不在数据库中由其模型表的列表示。事实上,一个ManyToManyField代表另一个表,用于链接n:m关系两侧的模型。
对于n:m关系的任意一侧发出诸如post_save的模型信号是没有意义的。 当ManyToManyField发生更改时,m2m_changed signal会退出:
在模型实例上更改ManyToManyField时发送。严格来说,这不是模型信号,因为它是由ManyToManyField发送的,但由于它在跟踪模型的更改时补充了pre_save / post_save和pre_delete / post_delete,因此它包含在此处。