Django: как написать запрос для сортировки с использованием нескольких столбцов, отображение через шаблон
Я новичок в Django и не слишком разбираюсь в MVC, DB-запросах.
У меня есть таблица Customer, которая включает имя_пользователя, имя_домена, а также имя_состояния (вытащили из таблицы внешних ключей). В HTML я пытаюсь отобразить результаты в списке, сначала отсортированном в алфавитном порядке по имени_ state_name, затем по имени city_name, а затем по имени имени пользователя. Так вот..
ARIZONA
PHOENIX
AAA, Inc.
BBB, LLC.
SCOTTSDALE
AAA, LLC.
DDD, Corp.
CALIFORNIA
ANAHEIM
...
My model.py выглядит следующим образом:
from django.db import models
class Customer(models.Model):
def __unicode__(self):
return self.customer_name
customer_name = models.CharField(max_length=60)
city_name = models.CharField(max_length=30)
state = models.ForeignKey('State')
class State(models.Model):
def __unicode__(self):
return self.state_name
state_name = models.CharField(max_length=20)
state_code = models.CharField(max_length=2)
В моем urls.py у меня есть:
url("^customers/$",
direct_to_template,
{'template': 'pages_fixed/customers.html',
'extra_context': {'customers': Customer.objects.all().order_by('state')}},
name='customers'),
И в моем HTML, у меня есть рабочий шаблон как:
<div class='customers'>
{% for customer in customers %}
<div class='block_customer'>
<p>{{ customer.state.state_name }}</p>
<p>{{ customer.city_name }}</p>
<p>{{ customer.customer_name }}</p>
</div>
{% endfor %}
</div>
Все это работает, но, очевидно, не правильно сортируется, и я не уверен, что это лучший способ его разработки. Я пробовал некоторые внутренние циклы с шаблонами, надеялся, что шаблоны позволят мне определить некоторые правила сортировки, но это, похоже, не поддерживается/правильно. Я подозреваю, что мне нужно запрашивать данные по-другому или предварительно сортировать их в коде раньше времени? Я не уверен, что это будет сделано в представлении (что такое Django-форма контроллера?). Если бы кто-нибудь мог указать мне в правильном направлении, это было бы очень полезно!
Ответы
Ответ 1
Существует несколько уровней для отображения объектов упорядоченных моделей в шаблоне, каждый из которых перезаписывает предыдущий уровень:
- (МОДЕЛЬ УРОВЕНЬ) Мета-атрибут
ordering
, как показано @Bithin в его ответе (подробнее о django docs)
-
(ПРОСМОТР УРОВНЯ) QuerySet order_by
метод, как вы пробовали в своем примере просмотра, который будет работать
как вы хотите, если добавить другие поля для сортировки:
Customer.objects.order_by('state', 'city_name', 'customer_name')
(подробнее о django docs). Обратите внимание, что .all()
здесь не требуется.
- (TEMPLATE LEVEL)
regroup
тег шаблона нужно использовать вложенным в ваш образец (подробнее на django docs)
Ответ 2
Вы можете указать порядок внутри модели,
class Customer(models.Model):
customer_name = models.CharField(max_length=60)
city_name = models.CharField(max_length=30)
state = models.ForeignKey('State')
def __unicode__(self):
return self.customer_name
class Meta:
ordering = ['customer_name', 'city_name', 'state']
Надеюсь, что это поможет.