Фильтр Django order by() с отличным()

Как я могу сделать order_by такой ....

p = Product.objects.filter(vendornumber='403516006')
                   .order_by('-created').distinct('vendor__name')

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

надеюсь, что это имеет смысл?

Я получил эту ошибку DB:

SELECT DISTINCT on выражения должны соответствовать начальному порядку по выражениям Строка 1: Выберите DISTINCT ON ("search_vendor"."имя") "поисковый продукт."..

3 ответов


на основе Вашего сообщения об ошибке и это другой вопрос, мне кажется, это исправит его:

p = Product.objects.filter(vendornumber='403516006')\
               .order_by('vendor__name', '-created').distinct('vendor__name')

то есть, кажется, что DISTINCT ON выражение(ы) должно соответствовать крайнему левому ORDER BY выражения(ы). Поэтому, сделав столбец, который вы используете в distinct как первый столбец order_by, Я думаю, что это должно сработать.


просто сопоставление крайнего левого order_by () arg и distinct () не сработало для меня, вызвав ту же ошибку (ошибка Django 1.8.7 или функция)?

qs.order_by('project').distinct('project')

однако это сработало, когда я изменил на:

qs.order_by('project_id').distinct('project')

и у меня даже нет нескольких order_by args.


у меня была аналогичная проблема, но затем со связанными полями. Просто добавив соответствующее поле в distinct(), Я не получил правильные результаты.

Я хотел Сортировать по room__name держал person (связан с residency ) уникальная. Повторение связанного поля в соответствии с ниже исправлена моя проблема:

.order_by('room__name', 'residency__person', ).distinct('room__name', 'residency__person')

Смотрите также статьи по теме: