我正在使用 django-import-export 导入数据,但因为我使用foreignkeywidgets,所以有很多数据库调用,使得导入速度非常慢,只有几百行(使用 django-debug-toolbar 检查)。
在批量导入的文档页面中提到了以下内容:
“如果您使用ForeignKeyWidget,那么这可能会影响性能,因为它从数据库中读取每一行。如果这是一个问题,那么创建一个子类来缓存 get_queryset() 结果,而不是为每次调用读取结果。”
我相信缓存 get_queryset() 结果可以帮助我,但我不知道如何进行缓存。你能帮我一些示例代码吗?
我尝试了以下操作,但仍然看到相同数量的数据库调用:
class CachedForeignKeyWidget(ForeignKeyWidget):
def __init__(self, model, field="pk", use_natural_foreign_keys=False, **kwargs):
self.cached_queryset = model.objects.all()
super().__init__(model, field, use_natural_foreign_keys, **kwargs)
def get_queryset(self, value, row, *args, **kwargs):
return self.cached_queryset
bulk_import
脚本对此进行了测试。
我的观点是,正在使用 QuerySet 缓存,因此,尽管您看到关系表的 SELECT SQL 输出,但正在使用缓存,因此对性能的影响很小。
我可以在日志中看到,即使导入 100k 行,FK 表的查找所花费的时间也可以忽略不计。
我还看到在导入过程中遇到了缓存断点。
如果您发现导入速度缓慢,则一定存在其他问题,因此了解问题所在会很有用。
请自行测试,但我的观点是 Django QuerySet 缓存工作正常,不需要实现您自己的缓存。我会更新文档。