Выбор различных значений из поля таблицы
Я изо всех сил пытаюсь обойти ОРМ Джанго. То, что я хочу сделать, это получить список уникальных значений в поле на моем столе .... эквивалент одного из следующих:
SELECT DISTINCT myfieldname FROM mytable
(или)
SELECT myfieldname FROM mytable GROUP BY myfieldname
Я бы, по крайней мере, хотел сделать это способом Django, прежде чем прибегать к raw sql. Например, с таблицей:
id, улица, город
1, Главная Улица, Корпус
2, Вторая Улица, Халл
3, Биббл Путь, Лестер
4, Другой Путь, Лестер
5, Хай-Стрит, Лондидиум
Я хотел бы получить:
Халл, Лестер, Londidium.
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()
ondistinct("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 []