使用Django Prefetch的to_attr参数时,_prefetched_objects_cache为空如何验证预取?
验证Django中带to_attr参数的Prefetch预取操作
当使用Prefetch的to_attr参数时,预取的数据不会存入_prefetched_objects_cache,而是直接存储在你指定的自定义属性名上——也就是示例里的people。
验证方法
直接访问自定义属性
你可以直接查看实例的people属性,确认预取结果是否存在:>>> print(books[0].people) [<Author: Author (ID #1)>]注意这个属性里存的是预取到的对象列表,而非默认预取返回的QuerySet类型。
结合查询次数验证(更严谨)
在测试中,可用Django的assertNumQueries确保预取生效,避免N+1查询问题:from django.test import TestCase class BookPrefetchTest(TestCase): def test_prefetch_with_to_attr(self): # 假设已提前创建测试数据 with self.assertNumQueries(2): books = Book.objects.prefetch_related( Prefetch( "authors", queryset=Author.objects.filter(author_type="MAIN"), to_attr="people" ) ).all() # 遍历访问所有书籍的预取属性,确认无额外查询 for book in books: self.assertTrue(book.people)这里断言只会执行2次查询:一次查询所有Book,一次批量查询对应的Author,以此证明预取已完成。
为什么_prefetched_objects_cache为空?
Django在使用to_attr时,会跳过默认的_prefetched_objects_cache缓存机制,直接把预取的结果列表赋值给你指定的实例属性,因此这个缓存字典会呈现为空状态。
内容的提问来源于stack exchange,提问作者Phil Gyford
相关产品推荐
相关产品推荐

