Как отсортировать данные сериализатора в сериализаторе MethodField при использовании ListViewSet? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть класс скажем 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"
}]

1 Ответ

0 голосов
/ 23 апреля 2019

Я бы попробовал упорядочить по двум полям, которые вы комбинируете:

ordering = ('city', 'state')

UPDATE:

в соответствии с вашими измененными критериями, попробуйте:

ordering = ('address_set__address', )

хотя в соответствии с этой записью есть проблемы с этим методом, на которые отвечающий отвечал путем жесткого кодирования порядка в связанной модели. Итак, в вашем случае:

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

затем в вашей другой модели / сериализаторе:

ordering = ('address_set', )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...