对于ForeignKey的Django refresh_from_db

时间:2017-03-22 08:46:03

标签: python django

有没有办法使用refresh_from_db并自动在ForeignKey上传播它?

model.py:

class TestItemModel(models.Model):
  value = models.IntegerField(default=0)
  relies_on_item = models.ForeignKey('self', on_delete=models.SET_NULL, blank=True, null=True )

>>> end_product = TestItemModel(value=1)
>>> end_product.save()
>>> container_product = TestItemModel(value=10,relies_on_item=end_product)
>>> container_product.save()
>>> end_product.pk
12
>>> end_product_for_update=TestItemModel.objects.get(pk=12)
>>> end_product_for_update.value = 4
>>> end_product_for_update.save()
>>> container_product.relies_on_item.value
1
>>> container_product.refresh_from_db()
>>> container_product.relies_on_item.value
1

此时返回的值仍然是初始值。有没有选项让refresh_from_db自动级联在ForeignKey引用的元素上?

可以通过在引用的项目上显式使用refresh_from_db来实现它 - 如下所示。但我想只需要在container_product本身上执行refresh_from_db。

shell(续):

>>> container_product.relies_on_item.refresh_from_db()
>>> container_product.relies_on_item.value
4

2 个答案:

答案 0 :(得分:5)

AFAIK在django中,直到现在refresh_from_db不会更新关系字段的数据。它只检查关系是否被删除。但你可以这样做(就像你一样)。

for i in container_product._meta.concrete_fields:
    if i.is_relation:
        getattr(container_product, i.name).refresh_from_db()

或覆盖refresh_from_db

class Mymodel(models.Model):
    def refresh_from_db(self, using=None, fields=None):
        super(Mymodel, self).refresh_from_db(using=None, fields=None)
        for i in self._meta.concrete_fields:
            if i.is_relation and getattr(self, i.name):
                getattr(self, i.name).refresh_from_db() 

答案 1 :(得分:0)

另一种解决方案是不使用refresh_from_db从数据库再次检索实例。

instance = MyModel.objects.get(pk=pk)