Выбор различных значений из поля таблицы


Я изо всех сил пытаюсь обойти ОРМ Джанго. То, что я хочу сделать, это получить список уникальных значений в поле на моем столе .... эквивалент одного из следующих:

SELECT DISTINCT myfieldname FROM mytable

(или)

SELECT myfieldname FROM mytable GROUP BY myfieldname

Я бы, по крайней мере, хотел сделать это способом Django, прежде чем прибегать к raw sql. Например, с таблицей:

id, улица, город

1, Главная Улица, Корпус

2, Вторая Улица, Халл

3, Биббл Путь, Лестер

4, Другой Путь, Лестер

5, Хай-Стрит, Лондидиум

Я хотел бы получить:

Халл, Лестер, Londidium.

3 72

3 ответа:

скажите, что ваша модель "магазин"

class Shop(models.Model):
    street = models.CharField(max_length=150)
    city = models.CharField(max_length=150)

    # some of your models may have explicit ordering
    class Meta:
        ordering = ('city')

так как вы можете иметь Meta класс ordering набор атрибутов, вы можете использовать order_by() без параметров, чтобы очистить любой заказ при использовании distinct(). Смотрите документацию в разделе order_by()

если вы не хотите, чтобы к запросу применялся какой-либо порядок, даже порядок по умолчанию, вызовите order_by() без параметров.

и distinct() в примечании где обсуждаются вопросы с использованием distinct() С заказ.

чтобы запросить вашу БД, вам просто нужно позвонить:

models.Shop.objects.order_by().values('city').distinct()  # returns a dictionary

или

models.Shop.objects.order_by().values_list('city').distinct()  # returns a list of tuples.

вы также можете добавить flat=True до values_list чтобы иметь плоский список.

Читайте также: получить различные значения Queryset по полю

в дополнение к еще очень актуальному ответ jujule, Я считаю весьма важным также знать о последствиях order_by() on distinct("field_name") запросы. это, однако, только функция Postgres!

если вы используете Postgres и если вы определяете имя поля, для которого запрос должен быть отличным, то order_by() должен начинаться с того же имени Поля (или имен полей) в той же последовательности (может быть больше полей потом.)

Примечание

при указании имен полей необходимо указать order_by() в поле QuerySet и поля в order_by () должны начинаться с полей в различны(), в том же порядке.

например, SELECT DISTINCT ON (a) дает вам первую строку для каждого значение в столбце. Если вы не укажете порядок, вы получите некоторые произвольная строка.

если вы хотите e-G-извлечь список городов, которые вы знайте магазины, пример jujule должен быть адаптирован к этому:

# returns an iterable Queryset of cities.
models.Shop.objects.order_by('city').values_list('city', flat=True).distinct('city')  

пример:

# select distinct code from Platform where id in ( select platform__id from Build where product=p)
pl_ids = Build.objects.values('platform__id').filter(product=p)
platforms = Platform.objects.values_list('code', flat=True).filter(id__in=pl_ids).distinct('code')
platforms = list(platforms) if platforms else []