2010-03-17 6 views
61

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

SELECT DISTINCT myfieldname FROM mytable 

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

SELECT myfieldname FROM mytable GROUP BY myfieldname 

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

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

1, Main Street, Hull

2 Other Street, Hull

3 Биббл Way, Leicester

4, Другой способ, Лестер

5, High Street, Londidium

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

Hull, Лестер, Londidium.

ответ

128

Произнесите модель «Магазин»

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 иметь плоский список.

См. Также: Get distinct values of Queryset by field

+25

Фактически, что работает. Однако! Я не мог заставить его работать на всех моих моделях. Вряд ли он работал над некоторыми, но не с другими. Для тех, у кого есть мета-заказ, это не работает. Итак, сначала нужно очистить заказ в наборе запросов. models.Shop.objects.order_by(). Values ​​('city'). Distinct() – alj

+1

Важно отметить, что 'values_list' фактически не возвращает список. Он возвращает что-то вроде набора запросов.Мне было полезно всегда использовать list() для вызовов values_list. – dheerosaur

+8

'values_list' возвращает ValuesListQuerySet, который является итератором. Кастинг в список может быть удобным, но также может поражать производительность, когда все строки должны оцениваться сразу, особенно с большими наборами данных. –