Django - 使用信号刷新另一个模型的字段

时间:2017-02-28 00:37:17

标签: python django

我有两个模型,其中一个使用其他模型的数据来填充自己的字段。问题是当第一个模型更新时,第二个模型也不会更新自己的字段。我必须进入并实际编辑/保存第二个模型,以便更新其字段。

这样的事情:

models.py:

class ModelA(models.ModelForm)
    ...

class ModelB(models.ModelForm)
    count_number_of_model_A = models.IntegerField
    def save(self)
         self.count_number_of_model_A = ModelA.objects.all().count()
         super(ModelB, self).save()

(这是我尝试做的简化版)

现在我想要字段" count_number_of_model_A"在ModelB中每次更改ModelA时都会更新。现在,只有在我实际修改+ save ModelB时它才会刷新。

我认为答案是使用信号(可能?)。我试图设置一个信号,以便只要在ModelA中创建一个新对象,ModelB就会更新。我有以下内容:

@receiver(post_save, sender=ModelA)
def update_sends(sender, **kwargs):
    if kwargs.get('created', False):
         #some code here to refresh ModelB??

信号运行正常,好像我输入了ModelB.objects.filter(某些过滤器).update(某个字段)之类的东西,当我进入并创建一个新的ModelA对象时,这些变化就会反映出来。但是整个模型本身并没有更新,我所追求的字段(" count_number_of_model_A")不会刷新。

任何帮助?

1 个答案:

答案 0 :(得分:1)

只需使用:

for model_b in ModelB.objects.filter(<some_filter>):
    model_b.save()

但是你应该知道,这会将所有(已过滤的)对象拉到Django,它们会对它们执行某些操作并将它们保存回数据库。这比使用query expressions要慢得多。您将需要更多的工作来设置它,但它运行得更快 - 尤其是在数据库增长时。