首页 > 解决方案 > 如何在使用 ListViewSet 时对序列化器 MethodField 上的序列化器数据进行排序?

问题描述

我有一堂课说 GetStudentDetails 我正在使用一个序列化器,它的序列化器 MethodField 说 postal_address 并且我希望我的结果基于这个字段进行排序

我尝试添加 ordering = ('postal_address',) 并且由于它不是模型字段,因此遇到错误。

class GetStudentDetails(viewsets.GenericViewSet, mixins.ListModelMixin):
    model = Student
    queryset = Student.objects.all()
    serializer_class = StudentCreateSerializer
    filter_backends = 
    (filters.OrderingFilter,filters.DjangoFilterBackend,)

class StudentCreateSerializer(serializers.ModelSerializer):
    postal_address = serializers.SerializerMethodField()

    def get_postal_address(self, obj):
        return Address.objects.get(name=obj.name).address

    class Meta:
        model = Vehicle
        fields = ('name','city','state',postal_address')

class Address(models.Model):
    name=models.ForeignKey(Student, on_delete=models.CASCADE)
    address=models.CharField(max_length=60)

class Student(models.Model):
    name=models.CharField(max_length=45)
    city=models.CharField(max_length=10)
    state=models.CharField(max_length=10)

    def __str__(self):
        return name

实际结果:

[{"name":test",
"city":"abc",
"state":"def",
"postal_address":"abcdef"
},
{
"name":"test2",
"city":"aa",
"state":"bb",
"postal_address":"aabb"
}]

预期结果:

[{
"name":"test2",
"city":"aa",
"state":"bb",
"postal_address":"aabb"
},
{"name":test",
"city":"abc",
"state":"def",
"postal_address":"abcdef"
}]

标签: pythondjangodjango-rest-framework

解决方案


我会尝试按您正在组合的 2 个字段排序:

ordering = ('city', 'state')

更新:

根据您更改的标准,尝试:

ordering = ('address_set__address', )

尽管根据这篇文章,这种方法存在问题,回答者通过将排序硬编码到相关模型中来解决。所以在你的情况下:

class Address(models.Model):
    ...
    class Meta:
        ordering = ('address',)

然后在您的其他模型/序列化器中:

ordering = ('address_set', )

推荐阅读