使用ForeignKeyWidget时如何缓存get_queryset()

问题描述 投票:0回答:1

我正在使用 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
django django-import-export
1个回答
0
投票

我已经使用

bulk_import
脚本对此进行了测试。

我的观点是,正在使用 QuerySet 缓存,因此,尽管您看到关系表的 SELECT SQL 输出,但正在使用缓存,因此对性能的影响很小。

我可以在日志中看到,即使导入 100k 行,FK 表的查找所花费的时间也可以忽略不计。

我还看到在导入过程中遇到了缓存断点

如果您发现导入速度缓慢,则一定存在其他问题,因此了解问题所在会很有用。

请自行测试,但我的观点是 Django QuerySet 缓存工作正常,不需要实现您自己的缓存。我会更新文档。

© www.soinside.com 2019 - 2024. All rights reserved.