it-swarm.com.ru

Django: Как написать запрос для сортировки по нескольким столбцам, отобразить через шаблон

Я совершенно новичок в Django и не слишком опытен в MVC, запросах к БД. 

У меня есть таблица Customer, которая включает в себя customer_name, city_name, а также state_name (извлечено из таблицы внешнего ключа). В HTML я пытаюсь отобразить результаты в списке, сначала отсортированном в алфавитном порядке по state_name, затем по city_name, затем по customer_name name. Вот так..

ARIZONA
   PHOENIX
     AAA, Inc.
     BBB, LLC.

   SCOTTSDALE
     AAA, LLC.
     DDD, Corp.

CALIFORNIA
   ANAHEIM
     ...

Мой 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>

Это все работает, но, очевидно, неправильно сортирует, и я не уверен, что это лучший способ создать его. Я попробовал некоторые внутренние циклы с шаблонами, надеясь, что шаблоны позволят мне определить некоторые правила сортировки, но это, кажется, не поддерживается/корректно. Я подозреваю, что мне нужно запросить данные по-другому или предварительно отсортировать их в коде заранее? Я не уверен, что это будет сделано в представлении (какова форма контроллера Джанго?) .. Если бы кто-то мог указать мне правильное направление, это было бы НАМНОГО признательно! 

33
pete

Существует несколько уровней для отображения упорядоченных моделей объектов в шаблоне, каждый из которых перезаписывает предыдущий уровень:

  1. (УРОВЕНЬ МОДЕЛИ) Мета-атрибут ordering, как показывает @Bithin в своем ответе (подробнее о Django docs)
  2. (ПРОСМОТР УРОВНЯ) Метод QuerySet order_by, как вы пробовали в своем примере просмотра, который будет работать Как вы хотите, если добавите другие поля для сортировки:

    Customer.objects.order_by('state', 'city_name', 'customer_name')

    (подробнее о Django docs). Обратите внимание, что .all() здесь не нужен.

  3. (УРОВЕНЬ ШАБЛОНА) regroup шаблон тега необходимо использовать вложенный в ваш образец (подробнее о Django docs)
66
juliocesar

Вы можете указать порядок внутри модели, 

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']

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

12
Bithin

Если вы хотите упорядочить по какому-либо полю «основной» модели, в этом случае вы должны написать что-то вроде этого:

Customer.objects.order_by('state__state_name', 'city_name', 'customer_name')

Посмотрите на состояние __state_name, двойное _ после первого состояния, сделайте доступ к полю этой модели.

0
DanielB