Django 模型 reload_from_db() 与从 db 显式调用

ele*_*han 5 python django django-models

如果我从模型中检索到一个对象,例如:

obj = Foo.objects.first()
Run Code Online (Sandbox Code Playgroud)

我知道如果我想稍后引用这个对象并确保它具有数据库中的当前值,我可以调用:

obj.refresh_from_db()
Run Code Online (Sandbox Code Playgroud)

我的问题是,使用这种refresh_from_db()方法比简单地做有什么优势吗?:

obj = Foo.objects.get(id=obj.id)
Run Code Online (Sandbox Code Playgroud)

据我所知,结果是一样的。refresh_from_db()看起来更明确,但在某些情况下,这意味着额外的一行代码。假设我更新了该value字段obj,稍后想测试它是否已更新为False. 相比:

obj = Foo.objects.first()
assert obj.value is True
# value of foo obj is updated somewhere to False and I want to test below
obj.refresh_from_db()
assert obj.value is False
Run Code Online (Sandbox Code Playgroud)

有了这个:

obj = Foo.objects.first()
assert obj.value is True
# value of foo obj is updated somewhere to False and I want to test below
assert Foo.objects.get(id=obj.id).value is False
Run Code Online (Sandbox Code Playgroud)

我对讨论这两者中哪一个更 Pythonic 不感兴趣。相反,我想知道一种方法在资源、性能等方面是否比另一种方法具有实际优势。我已经阅读了这一部分文档,但我无法从中确定使用reload_db(). 谢谢!

ser*_*erg 6

Django 源代码通常相对容易理解。如果我们查看refresh_from_db() 实现,它的核心仍然使用相同的 Foo.objects.get(id=obj.id)方法:

db_instance_qs = self.__class__._default_manager.using(db).filter(pk=self.pk)
...
db_instance_qs = db_instance_qs.only(*fields)
...
db_instance = db_instance_qs.get()
Run Code Online (Sandbox Code Playgroud)

只有几个额外的花里胡哨:

  • 延迟字段被忽略
  • 陈旧的外键引用被清除(根据注释解释)

因此,对于日常使用,可以肯定地说它们几乎相同,使用您喜欢的任何内容。