Получение отдельных записей на основе столбца на Django - PullRequest
7 голосов
/ 18 января 2011

Мне нужно получить список записей для следующей таблицы с различными значениями в отношении имени:

Class C:

name                value
A ------------------ 10
A ------------------ 20
A ------------------ 20
B ------------------ 50
C ------------------ 20
D ------------------ 10
B ------------------ 10
A ------------------ 30

Мне нужно избавиться от всех повторяющихся значений для имени и показать только следующее:

name                value
A ------------------ 30
B ------------------ 10
C ------------------ 20
D ------------------ 10

Как видите, это выглядит почти как набор питонов. Я, вероятно, могу сгенерировать набор с помощью Python, но мне интересно, есть ли в Django ORM эта функция

Я пытался использовать разные, но он не принимает никаких аргументов, чтобы указать, какой столбец должен иметь разные значения. Есть идеи, как заставить этот запрос работать?

Ответы [ 3 ]

19 голосов
/ 18 января 2011

.distinct() - это инструмент, но вот синтаксис, который мне пришлось использовать:

Model.objects.values_list('name', flat=True).distinct()

Таким образом, вы получите только список [A, B, C, D] значений, а не объекты, которые они сами себе хотят.

0 голосов
/ 17 декабря 2018

Проблема с отчетливым sqlite заключается в том, что он различается по всем возвращаемым значениям.Чтобы различать одно имя столбца, например: 'url', чтобы получить все уникальные URL-адреса из таблицы, а также получить остальные данные, используйте подзапрос.

Подзапрос получает идентификаторы URL-адресов изатем использует это, чтобы сделать еще один запрос на эти идеи.Конечно, это не так быстро, как обычное отличие.

link_ids = (
    Resources
    .values('url')
    .distinct()
    .annotate(
        occurrences=Count('url'),  # make unique 'urls' only occur once.
        pk=Min('pk')  # return pk of first occurrence
    )
)
broken_links_qs = (
    Resources.filter(id__in=Subquery(link_ids.values('pk')))
)

(В то время, когда были даны предыдущие ответы, у django еще не было функции подзапроса.)

0 голосов
/ 10 апреля 2018

Вы также можете использовать raw как:

queryraw = C.objects.raw('SELECT name, value FROM prj_c GROUP BY name')

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

queryraw = C.objects.raw('SELECT name, value FROM prj_c GROUP BY name ORDER BY value')

В любом случае вы можете иметь list() объектов.

Полезная документация здесь: https://docs.djangoproject.com/en/2.0/topics/db/sql/

...