如何在DRF中对序列化程序自定义字段的值进行排序 [英] How to sort values of serializer custom field in DRF
问题描述
我已经在客户端序列化程序中创建了一个自定义字段。
此字段的值是通过复杂的序列化器方法计算的。
I have created a custom field in the client serializer. The value of this field is calculated by a complex serializer method.
class ClientsStatsSerializer(serializers.ModelSerializer):
"""
Serializer shows total_spend for 2019 by client.
"""
refs_count = serializers.SerializerMethodField()
total_spend_2019 = serializers.SerializerMethodField()
class Meta:
model = Company
ordering = ('total_spend_2019',)
fields = [
'id',
'legal_name',
'refs_count',
'total_spend_2019',
]
def get_total_spend_2019(self, obj):
...
我想让输出按照 total_spend_2019
。看来我在这里不能通过简单的 ordering =('total_spend_2019',)
来做到这一点。在模型中,在视图中都不能这样做。
I would like to get the output sorted by the value of total_spend_2019
. It looks like I cannot do it here with a simple ordering = ('total_spend_2019',)
I cannot do it either in the model, neither in the view.
编辑:拥有一个可以与任何SerializerMethodField一起使用的通用解决方案将是很棒的。
It would be great to have a generic solution that would work with any SerializerMethodField.
当前视图如下:
class ClientsStatsViewSet(viewsets.ViewSet):
def list(self, request):
queryset = request.user.company.clients.all()
client_id = self.request.query_params.get('client_id', None)
if client_id is not None:
queryset = queryset.filter(pk=client_id)
serializer = ClientsStatsSerializer(queryset, many=True)
return Response(serializer.data)
有什么办法解决这个问题吗?
Any idea how to solve this?
非常感谢!!
推荐答案
好的,我设法用f来解决如下:
All right, I managed to solve it with the following:
class ClientsStatsViewSet(viewsets.ViewSet):
def list(self, request):
queryset = request.user.company.clients.all()
client_id = self.request.query_params.get('client_id', None)
if client_id is not None:
queryset = queryset.filter(pk=client_id)
serializer = ClientsStatsSerializer(queryset, many=True)
serializer_data = sorted(
serializer.data, key=lambda k: k['total_spend_2019'], reverse=True)
return Response(serializer_data)
我不知道这是否是执行此操作最有效的方法,但是它可以工作。
I don't know if it is the most performant way to do this, but it works.
这篇关于如何在DRF中对序列化程序自定义字段的值进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!