我正在为一个实习应用程序制作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'
感谢您对解决此问题的任何帮助!你知道吗
根据您的代码,
BunnySerializerPartial
需要为每个bunny获取所有相关的vegetables
。 所以select_related
是不够的,你应该写:这样,将执行第二个查询,以获取与所有选定兔子相关的所有蔬菜。你知道吗
相关问题 更多 >
编程相关推荐