Упорядочение фреймворка django без поля модели (поле сериализатора) - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу упорядочить свои поля следующим образом:

class DealerBackOfficeViewSet(mixins.ListModelMixin,
                          mixins.RetrieveModelMixin,
                          mixins.CreateModelMixin,
                          mixins.UpdateModelMixin,
                          viewsets.GenericViewSet):
filter_backends = (filters.OrderingFilter,
                   )
ordering_fields = ('online',...)

Этот способ упорядочения работает только для полей модели, но онлайн-поле, определенное в моем сериализаторе, и пока тест в почтальоне не работает.Я хочу сделать это следующим образом:

class CustomOrdering(filters.OrderingFilter):

def filter_queryset(self, request, queryset, view):
    params = request.query_params.get(self.ordering_param)
    if params == 'online':
        ...   my serializer codes
    return super(CustomOrdering, self).filter_queryset(request, queryset, view)

эта проблема в других областях порядок не работает !!есть ли способ решить это каким-либо образом?Если связанные документы помогут мне, пожалуйста, дайте мне ссылку.спасибо за ваш сайт

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

после борьбы в этой задаче я не понимаю, каким образом существует способ обозначить эти поля как поле модели и не требовать пользовательского заказа и каких-либо дополнительных кодов!в моей функции get_queryset я изменяю код:

queryset = Dealer.objects.all()

на:

queryset = Dealer.objects.all().annotate(bids_count=Count('bid'), device_count=Count('device'))

обратите внимание, что эти два поля в моем сериализаторе отсутствуют в моей модели.в моем сериализаторе измените это поле с SerializerMethodField на IntegerField и очистите defs.

, затем в моем файле API добавьте следующее:

filter_backends = (filters.OrderingFilter,)
ordering_fields = ('bids_count', 'device_count')

это мой последний сериализатор:

class DealerListSerializer(serializers.ModelSerializer):
    device_count = serializers.IntegerField()
    bids_count = serializers.IntegerField()

    class Meta:
        model = Dealer
        fields = ('id', 'last_name', 'first_name', 'username', 'person_trust', 'is_active',
                  'work_type', 'address', 'mobile', 'device_count', 'online', 'bids_count')

таким образом, мой код очень ясен, а мой CustomOrdering и все операторы elif также чисты!

0 голосов
/ 12 декабря 2018

Это не работает, потому что поля, определенные в вашем сериализаторе, не являются частью модели.Атрибут ordering работает только для полей модели.Вам, вероятно, придется ввести обходной путь, например, создать динамическое поле, используя аннотации , а затем упорядочить, используя это поле, но это зависит от того, можно ли аннотировать логику онлайн-поля.

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