Вопрос

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

SELECT DISTINCT myfieldname FROM mytable

(или альтернативно)

SELECT myfieldname FROM mytable GROUP BY myfieldname

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

идентификационный номер, улица, город

1, Мейн-стрит, Халл

2, Другая улица, Корпус

3, Библ-Уэй, Лестер

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

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

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

Халл, Лестер, Лондидиум.

Это было полезно?

Решение

Допустим, ваша модель - "Магазин".

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()

Он возвращает словарь

или

models.Shop.objects.order_by().values_list('city').distinct()

Этот возвращает ValuesListQuerySet который вы можете применить к list.Вы также можете добавить flat=True Для values_list чтобы сгладить результаты.

Смотрите также: Получить различные значения набора запросов по полю

Другие советы

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

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

Примечание

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

Например, ВЫБЕРИТЕ DISTINCT В (a), чтобы получить первую строку для каждого значения в столбце a.Если вы не укажете порядок, вы получите некоторую произвольную строку.

Если вы хотите , например , извлечь список городов , в которых вы знаете магазины , пример 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 []
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top