Django: ValueError: Prefetch querysets cannot use raw(), values(), and values_list()

Django: ValueError: Prefetch querysets cannot use raw(), values(), and 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。

预取时确实不能使用.values(…) [Django-doc] and .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]
        )<b>.only('close', 'volume', <i>'symbol_id'</i>)</b>
    )
)

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