Упорядочивание данных после различных

Я различаю данные с помощью sku_id

    queryset = self.filter_queryset(queryset.order_by('sku_id','id').distinct('sku_id'))

Однако этот результат не сортируется по идентификатору,

затем я пытаюсь

    queryset = self.filter_queryset(queryset.order_by('sku_id','id').distinct('sku_id').order_by('id'))

Однако это показывает ошибку

ProgrammingError at /api/myfetch/
SELECT DISTINCT ON expressions must match initial ORDER BY expressions
LINE 1: SELECT COUNT(*) FROM (SELECT DISTINCT ON ("myapp_produc...

Можно ли отсортировать столбец после distinct?

Когда вы используете distinct('sku_id') в Django, это переводится как DISTINCT ON (sku_id) в PostgreSQL. Это похоже на функцию в PostgreSQL, которая требует указывать в ORDER BY тот же столбец, что и в DISTINCT.

В вашем втором запросе вы пытаетесь упорядочить данные по идентификатору, что PostgreSQL не позволяет.

Решение:

queryset = self.filter_queryset(
    queryset.order_by('sku_id', 'id').distinct('sku_id')
).order_by('id')

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

from django.db.models import Subquery

your_objects = YourObjectClass.objects.filter(sku_id__in=Subquery(YourObjectClass.objects.distinct('sku_id').values('sku_id'))).order_by('id')

Это должно привести к получению записей с различными sku_id, упорядоченных по возрастанию id.

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