django - 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
模型有很多列,我只想要close
和volume
例如,这里id__in=[1,2,3,4]
只是显示,一次最多可以有 10000+ 个 id。
解决方案
预取时确实不能使用.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 将不得不进行额外的查询来找出它如何链接到相应的,这只会减慢额外查询的处理速度,因此你最好也包括这个。ForeignKey
DailyPriceHistory
SymbolList
symbol_id
DailyPriceHistory
SymbolList
推荐阅读
- ios - SwiftUI - 单击 NavigationLink 时触发其他操作
- java - 是否有可能将多个设备 LatLng 与 1 个设备 LatLng 进行比较?
- flutter - 如何从列表中获取特定的 DocumentSnapshot
- github - GitHub 删除的文件正在抛弃语言统计信息
- c# - 从 JSON 中删除附加文本
- react-native - 在 createStackNavigator() 之前执行代码
- java - 检查 Firebase 实时数据库中是否存在字段
- amazon-web-services - 调用 UpdateService 操作时的 AWS ECS InvalidParameterExcpetion
- kotlin - 为什么此代码没有将所有大写字母替换为小写字母并将所有小写字母替换为大写字母?
- typescript - 为什么类型检查器允许此代码?