Django忽略select\u related,发出更多请求来获取相关对象

2024-09-21 01:17:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个实习应用程序制作djangoapi,遇到了一个优化问题,虽然我以前的问题几乎解决了,但我遇到了相关的问题。剩下的代码和初始问题是here

我使用的是select\u related,在我的视图中可以看到:

@api_view(["GET"])
def bunnyList(request, vegetableType):
""" Displays heap-sorted list of bunnies, in decreasing order.
    Takes word after list ("/list/xxx") as argument to determine
    which vegetable list to display"""
if vegetableType in vegetablesChoices:
    vegetables = Vegetable.objects.filter(vegetableType=vegetableType).select_related('bunny')
    vegetables = list(vegetables)

    if len(vegetables) == 0:
        return Response({"No bunnies": "there is 0 bunnies with this vegetable"},
                        status=status.HTTP_204_NO_CONTENT)

    heapsort(vegetables)

    bunnies = [vegetable.bunny for vegetable in vegetables]
    serialized = BunnySerializerPartial(bunnies, many=True)
    return Response(serialized.data, status=status.HTTP_200_OK)
else:
    raise serializers.ValidationError("No such vegetable. Available are: " + ", ".join(vegetablesChoices))

这应该只执行一个查询,但正如我在django debug toolbar中看到的那样,它在list constanding中使用一个+200另一个(每个蔬菜对象使用一个),就好像它完全忽略了select\相关查询中的连接一样。你知道吗

执行的查询包括:

SELECT ••• FROM "zajaczkowskiBoardApi_vegetable" INNER JOIN "zajaczkowskiBoardApi_bunny" ON ("zajaczkowskiBoardApi_vegetable"."bunny_id" = "zajaczkowskiBoardApi_bunny"."id") WHERE "zajaczkowskiBoardApi_vegetable"."vegetableType" = '''carrots'''

对于所有的物体,这个都做了细微的修改:

SELECT ••• FROM "zajaczkowskiBoardApi_vegetable" WHERE "zajaczkowskiBoardApi_vegetable"."bunny_id" = '153'

感谢您对解决此问题的任何帮助!你知道吗


Tags: toinidifstatusselectlistrelated
1条回答
网友
1楼 · 发布于 2024-09-21 01:17:43

根据您的代码,BunnySerializerPartial需要为每个bunny获取所有相关的vegetables。 所以select_related是不够的,你应该写:

vegetables = Vegetable.objects\
                      .filter(vegetableType=vegetableType)\
                      .select_related('bunny')\
                      .prefetch_related('bunny__vegetables')

这样,将执行第二个查询,以获取与所有选定兔子相关的所有蔬菜。你知道吗

相关问题 更多 >

    热门问题