我有一个django应用程序,该应用程序需要能够提供某种模型的记录的列表页,并根据用户,时间等简单字段进行排序。但是,该模型有时还需要一个与之关联的非常大的数组字段它(在某些情况下,每条记录可能高达10兆字节或更多),但是此数组数据仅在某些情况下使用,而与生成页面的时间无关。
据我所知,自加载模型对象以来,所有字段都会初始化,这会损害我的应用程序的性能,因为大量数据会不断初始化并丢弃,只是为了生成简单的列表视图?
即使我创建了一个包含大型数组数据的单独模型,并且原始记录指向一个带有ForeignKeyField的模型,由于django还将初始化与外键相关的对象,所以这不会有同样的问题吗?
如果有某种方法可以修改对象管理器以在某些情况下仅加载此数组字段,我认为这是不错的解决方案
答案 0 :(得分:0)
解决方案是在defer()
上调用QuerySet
,这可能会不必要地获取大字段。
来自Django documentation:
在某些复杂的数据建模情况下,您的模型可能包含一个 很多字段,其中一些字段可能包含很多数据(例如, 文本字段),或需要昂贵的处理才能将其转换为 Python对象。如果您在某些情况下使用查询集的结果 不知道是否需要这些特定字段的情况 最初获取数据时,您可以告诉Django不要检索 从数据库中获取它们。
这是通过传递不加载到的字段名称来完成的 defer():
如有必要,可以通过重写Manager.get_queryset()
方法