Django | Упорядочивание фильтров - Как реализовать "упорядочивание" при использовании @property

Помогите пожалуйста сделать правильный "заказ" для "пользовательского" свойства some_property_field. Я пишу такой URL и он не работает. Я так понимаю причина в "пользовательском" свойстве. Как это решить?

/api/articles/?ordering=-some_property_field

<
router = DefaultRouter()
router.register(r'articles', ArticleViewSet, basename='articles')
urlpatterns = []

urlpatterns += router.urls
<
class Article(models.Model):
    title = models.CharField(max_length=20)
    description = models.TextField()

    def __str__(self):
        return self.title

    @property
    def some_property_field(self):
        return f'{self.title} property func'

views.py

class ArticleViewSet(viewsets.ModelViewSet):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()
    filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter,)
    ordering_fields = ('id', 'title', 'some_property_field')
    ordering = ('id',)  # default ordering

serializers.py

class ArticleSerializer(serializers.ModelSerializer):
    some_property_field = serializers.CharField(read_only=True)

    class Meta:
        model = Article
        fields = '__all__'

Упорядочивание выполняется в наборе запросов, поэтому вы можете использовать только то поле, которое существует в базе данных.

Если вы хотите упорядочить по свойствам, вам нужно сделать это в python:

qs = sorted(Article.objects.all(), key=lambda obj: obj.some_property_field)
Вернуться на верх