首页 > 解决方案 > Django:ValueError:预取查询集不能使用 raw()、values() 和 values_list()

问题描述

我正在尝试如下运行预取并给我错误:Prefetch querysets cannot use raw(), values(), and values_list().

queryset = SymbolList.objects.prefetch_related(
            Prefetch('stock_dailypricehistory_symbol',queryset = DailyPriceHistory.objects.filter(id__in=[1,2,3,4]).values('close','volume'))).all()

DailyPriceHistory模型有很多列,我只想要closevolume

例如,这里id__in=[1,2,3,4]只是显示,一次最多可以有 10000+ 个 id。

标签: djangodjango-queryset

解决方案


预取时确实不能使用.values(…)[Django-doc].values_list(…)[Django-doc]。这也会导致额外的复杂性,因为那时 Django 很难找出如何在 Django/Python 级别执行“加入”,如果这是可能的话。

但是,您不需要使用.values(…)来限制您获取的列数,您可以使用.only(…)[Django-doc]代替。.only(…)只会立即在内存中获取给定的列和主键,并将“推迟”获取其他列。只有当您以后需要这些列时,它才会进行额外的查询。因此,这有点类似于 Django 仅ForeignKey在您需要时通过额外的查询获取内存中的相关对象。

queryset = SymbolList.objects.prefetch_related(
    Prefetch(
        'stock_dailypricehistory_symbol',
        queryset = DailyPriceHistory.objects.filter(
            id__in=[1,2,3,4]
        ).only('close', 'volume', 'symbol_id')
    )
)

是从指向模型的symbol_id列,这可能是与 不同的字段。如果你不包括这个,Django 将不得不进行额外的查询来找出它如何链接到相应的,这只会减慢额外查询的处理速度,因此你最好也包括这个。ForeignKeyDailyPriceHistorySymbolListsymbol_idDailyPriceHistorySymbolList


推荐阅读