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
模型有很多列,我只想要 close
和 volume
这里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_id
是ForeignKey
的列,从DailyPriceHistory
指向SymbolList
模型,这个可能是与 symbol_id
不同的字段。如果你不包括这个,Django 将不得不进行额外的查询来找出它如何 link DailyPriceHistory
到相应的 SymbolList
,这只会减慢额外查询的处理速度,因此你最好也包括这个。
我正在尝试 运行 如下预取,但出现错误: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
模型有很多列,我只想要 close
和 volume
这里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_id
是ForeignKey
的列,从DailyPriceHistory
指向SymbolList
模型,这个可能是与 symbol_id
不同的字段。如果你不包括这个,Django 将不得不进行额外的查询来找出它如何 link DailyPriceHistory
到相应的 SymbolList
,这只会减慢额外查询的处理速度,因此你最好也包括这个。