【发布时间】:2021-05-28 04:25:49
【问题描述】:
我正在使用 Django Rest 框架编写一个 api。该 api 获取客户列表。客户有许多项目。我的 api 应该返回包含已完成、待处理和总计项目数量的客户列表。我的 api 工作,但它有太多的 sql 查询。 api是分页的
class ClientViewSet(ModelViewSet):
"""
A simple view for creating clients, updating and retrieving
"""
model = Client
queryset = Client.objects.all()
serializer_class = ClientSerializer
现在我的客户端序列化器
class ClientSerializer(serializers.ModelSerializer):
total_projects_count = serializers.SerializerMethodField()
on_going_projects_count = serializers.SerializerMethodField()
completed_projects_count = serializers.SerializerMethodField()
class Meta:
model = Client
fields = __all__
def get_total_projects_count(self, obj):
return obj.total_projects_count()
def get_on_going_projects_count(self, obj):
return obj.on_going_project_count()
def get_completed_projects_count(self, obj):
return obj.completed_projects_count()
项目有一个客户端外键。我尝试使用注释来获取如下所有产品并进行分组。但是 annotate 只对单个字段起作用。
projects = Project.objects.filter(client__in=queryset).values('client', 'status')
如何对多个字段进行分组并将该额外参数传递给序列化程序。或者有没有更好的方法。我也尝试了 prefetch_related 但 total_projects_count 仍在执行新的 sql 查询
【问题讨论】:
-
可以添加
Client模型的三种计数方式吗?
标签: django postgresql django-rest-framework django-orm drf-queryset