【问题标题】:How can one assert in Django that a model field has already been populated from the DB?如何在 Django 中断言模型字段已经从数据库中填充?
【发布时间】:2014-02-01 05:56:09
【问题描述】:

在 Django 中,是否有一种简单的方法可以测试对象上的模型字段是否已从数据库中查询(例如,来自外键关系的对象)?

我想在我的一个测试中做出这样的断言,以确保访问我的一个对象上的特定属性不会触发额外的数据库查询。

【问题讨论】:

  • 除非我有误解,否则听起来您是在尝试测试 Django 功能而不是您自己的应用程序。这不是您在自己的单元测试中测试的那种东西。
  • 我知道你来自哪里。但是不,我不是在测试 Django 功能(例如select_related())。您可以将此视为测试,以检查我是否正在利用此类功能(例如,我的代码中的对象是通过 select_related() 获得的)。

标签: python django django-models


【解决方案1】:

在 ForeignKey 的特殊情况下,您可以检查 _FOO_cache 属性的存在。例如,如果您的 Employee 对象有一个指向 Company 的 ForeignKey,那么如果填充了 my_employee.company,则 my_employee._company_cache 将存在,因此您可以使用 hasattr(my_employee, '_company_cache')

【讨论】:

  • 这种公开行为是否记录在某处?如果是这种情况,我似乎找不到它,而且我对依赖可能在未来版本的 Django 中更改而不会通知的实现细节感到不安。
【解决方案2】:

您可以使用TestCase.assertNumQueries

检查obj.accessor 没有命中数据库:

# context manager version
with self.assertNumQueries(0):
  obj.accessor

# function version
self.assertNumQueries(0, lambda: obj.accessor)

【讨论】:

  • 这看起来是一个很好的答案,谢谢。但我想我更喜欢@DanielRoseman,因为它也可以用在代码本身的assert 语句中。
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 2021-04-14
  • 2014-05-05
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多