有没有办法使用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
答案 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)