Пользовательское упорядочивание в django rest framework?

У меня есть вид:

class ContactListView(generics.ListAPIView):

    queryset = Contact.objects.all()
    serializer_class = ContactSerializer
    filter_backends = (filters.SearchFilter,filters.OrderingFilter)
    ordering_fields = ['name']
    search_fields = ('name',)

Я установил порядок по name, но имя содержит имя и фамилию,

Я хочу установить порядок по Last Name

Я создал :

class SurnameOrdering(OrderingFilter):
    ordering_fields = ['surname']

    def get_ordering(self, request, queryset, view):
        pass

но как правильно установить этот порядок?

Мы можем аннотировать кверсет с помощью last_name и выполнить для этого упорядочивание:

from django.db.models import Value as V
from django.db.models.functions import Substr, StrIndex


class ContactListView(generics.ListAPIView):
    queryset = Contact.objects.annotate(
        last_name=Substr('name', StrIndex('name', V(' ')))
    )
    serializer_class = ContactSerializer
    filter_backends = (filters.SearchFilter, filters.OrderingFilter)
    ordering_fields = ('name', 'last_name')
    search_fields = ('name',)

Здесь мы позволяем базе данных определить last_name, а затем позволяем OrderingFilter фильтровать на этом last_name.

Вернуться на верх