Python Django:如何预取模型实例的相关数据。也许用queryset包装?

Python Django:如何预取模型实例的相关数据。也许用queryset包装?,python,django,django-rest-framework,query-optimization,Python,Django,Django Rest Framework,Query Optimization,我使用Django rest框架,在模型关系中有适当的嵌套 我正在优化我的查询。我的许多函数都使用或操作模型的单个实例,而它通常位于数据流的下游,因此我需要一些预取。一个典型的例子是使用DRF序列化程序。这里有一个例子 @api_view(['GET']) def fetch_user_profile(request): profile = request.user.profile # has many nested relationships return Response(

我使用Django rest框架,在模型关系中有适当的嵌套

我正在优化我的查询。我的许多函数都使用或操作模型的单个实例,而它通常位于数据流的下游,因此我需要一些预取。一个典型的例子是使用DRF序列化程序。这里有一个例子

@api_view(['GET'])
def fetch_user_profile(request):
    profile = request.user.profile # has many nested relationships

    return Response(UserProfileSerializer(profile).data, status=status.HTTP_200_OK) # this ends up taking many queries
我看到一些解决方案建议在上下文中使用
prefetch\u related
传递queryset,尽管我还不能完全了解这将如何工作(我只找到几个地方对其进行了部分讨论,可能会就此提出一个完全不同的问题)

一个简单的解决方案(并且可以推广到序列化程序之外)是,我可以使用一个包装器函数将我的实例包装到queryset中,然后对其调用预取,并将其传递到序列化程序中。

比如:

def queryset_wrap(instance):
    return type(instance).objects.filter(id=instance.id)

我想知道是否有更好的方法来做到这一点。

我自己还没有使用过这个,但我相信您正在寻找的是Django 1.10中引入的
预回迁相关对象()
函数

:

预取一组模型实例上的给定查找。这在接收模型实例列表而不是查询集的代码中很有用;例如,从缓存获取模型或手动实例化模型时

传递一组模型实例(必须都属于同一类)和要预取的查找或预取对象。例如:

因为它需要一个iterable,所以您可以将实例包装在一个列表中:

prefetch_related_objects([profile], "relevant_attribute_1", "relevant_attribute_2")
prefetch_related_objects([profile], "relevant_attribute_1", "relevant_attribute_2")