我可以在select_related()字段上添加注释吗?

时间:2020-08-26 16:27:29

标签: django django-rest-framework

作为优化,我想注释每个车主拥有多少辆车。

这似乎是一种奇怪的方法,但是我使用的是Django Rest Framework,序列化的Car有一个Owner字段,而Owner序列化包含一个动态计算用户拥有的汽车数量。

这是我想要的 ...

cars = Car.objects.select_related('owner').annotate(owner__cars_count=Count('owner__car'))

...除了我想要的是cars[0].owner.cars_count而不是cars[0].owner__cars_count。我要注释所有者,而不是 car ,以便DRF在序列化所有者时具有可用的字段。

objects中交换Owner也不起作用,因为select_related不在Car上不使用Owner管理器。

这与Nested annotate fields in Django REST Framework serializers极为相似,但是已接受的答案做了我已经在做的事情–根据SerializerMethodField中的每条记录进行计算。一个不被接受的答案描述了使用prefetch_related而不是select_related来完成此操作。

由于这是DRF,或者我可以将注释从Car.owner__cars_count复制到Car.owner.cars_count,然后再到达嵌套序列化程序?

1 个答案:

答案 0 :(得分:1)

您可以使用Prefetch类:

from django.db.models import Count, Prefetch

cars = Car.objects.prefetch_related(Prefetch('owner', Owner.objects.annotate(cars_count=Count('car'))))

for car in cars:
    print(car.owner.cars_count)