Подтвердить что ты не робот

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-форма контроллера?). Если бы кто-нибудь мог указать мне в правильном направлении, это было бы очень полезно!

4b9b3361

Ответ 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']

Надеюсь, что это поможет.