Выбор различных значений из поля таблицы
Я изо всех сил пытаюсь обойти ОРМ Джанго. То, что я хочу сделать, это получить список уникальных значений в поле на моем столе .... эквивалент одного из следующих:
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 []