Выберите различные значения из поля таблицы
-
20-09-2019 - |
Вопрос
Я изо всех сил пытаюсь разобраться в 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 []