作为优化,我想注释每个车主拥有多少辆车。
这似乎是一种奇怪的方法,但是我使用的是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
,然后再到达嵌套序列化程序?
答案 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)