You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Django Prefetch的to_attr参数时,_prefetched_objects_cache为空如何验证预取?

验证Django中带to_attr参数的Prefetch预取操作

当使用Prefetch的to_attr参数时,预取的数据不会存入_prefetched_objects_cache,而是直接存储在你指定的自定义属性名上——也就是示例里的people。

验证方法

  1. 直接访问自定义属性
    你可以直接查看实例的people属性,确认预取结果是否存在:

    >>> print(books[0].people)
    [<Author: Author (ID #1)>]
    

    注意这个属性里存的是预取到的对象列表,而非默认预取返回的QuerySet类型。

  2. 结合查询次数验证(更严谨)
    在测试中,可用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:45:58