Пользовательское упорядочивание в 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
.