Мне любопытно, есть ли способ сделать запрос в Django, который не является " SELECT * FROM...
" внизу. SELECT DISTINCT columnName FROM ...
Вместо этого я пытаюсь сделать " ".
В частности, у меня есть модель, которая выглядит так:
class ProductOrder(models.Model):
Product = models.CharField(max_length=20, promary_key=True)
Category = models.CharField(max_length=30)
Rank = models.IntegerField()
где Rank
- это ранг в Category
. Я хотел бы иметь возможность перебирать все категории, выполняя некоторые операции с каждым рангом в этой категории.
Я хотел бы сначала получить список всех категорий в системе, а затем запросить все продукты в этой категории и повторять, пока каждая категория не будет обработана.
Я бы предпочел избегать сырого SQL, но если мне придется туда пойти, все будет хорошо. Хотя я никогда раньше не кодировал необработанный SQL на Django / Python.
На самом деле это довольно просто, если вы используете PostgreSQL , просто используйте
distinct(columns)
( документацию ).Productorder.objects.all().distinct('category')
Обратите внимание, что эта функция была включена в Django с версии 1.4.
источник
can_distinct_on_fields
похоже, только для Postgresall()
здесь не обязательноДругие ответы хороши, но это немного чище, поскольку дает только те значения, которые вы получили бы из запроса DISTINCT, без каких-либо беспорядков от Django.
>>> set(ProductOrder.objects.values_list('category', flat=True)) {u'category1', u'category2', u'category3', u'category4'}
или
>>> list(set(ProductOrder.objects.values_list('category', flat=True))) [u'category1', u'category2', u'category3', u'category4']
И он работает без PostgreSQL.
Это менее эффективно, чем использование .distinct (), если предположить, что DISTINCT в вашей базе данных быстрее, чем python
set
, но он отлично подходит для работы с оболочкой.источник
values_list
не помещаетDISTINCT
в запрос sql, поэтому это принесло бы несколько значений, если бы они были.Пользователь упорядочивает по этому полю, а затем делает различное.
ProductOrder.objects.order_by('category').values_list('category', flat=True).distinct()
источник