Django:如何编写查询以使用多列进行排序,通过模板显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>

它有点工作,但显然没有正确排序,我不确定什么是最好的设计方法。我尝试了一些带有模板的内部循环,希望模板能让我定义一些排序规则,但这似乎不支持/正确。我怀疑我需要以不同的方式查询数据或提前在代码中对它们进行预先排序?我不确定这是否会在View中完成(Django的控制器形式是什么?)..如果有人能指出我正确的方向,那将是非常感谢!

答案

模板中显示有序模型对象有多个级别,每个级别都覆盖前一级别:

  1. (MODEL LEVEL)Meta属性ordering在他的回答中显示@Bithin(更多关于django docs
  2. (查看级别)在您的视图示例中尝试过QuerySet order_by方法,如果要添加其他字段进行排序,它将按您的意愿工作: Customer.objects.order_by('state', 'city_name', 'customer_name') (更多关于django docs)。请注意,这里不需要.all()
  3. (TEMPLATE LEVEL)regroup模板标签需要嵌套在你的样本中(更多关于django docs
另一答案

您可以指定模型内的顺序,

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

希望这可以帮助。

另一答案

如果您想按“主”模型的某个字段进行排序,在这种情况下,您必须编写如下内容:

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

看一下state__state_name,在第一个状态之后的double _,可以访问该模型的字段。

以上是关于Django:如何编写查询以使用多列进行排序,通过模板显示的主要内容,如果未能解决你的问题,请参考以下文章

按多列对多维数组进行排序

如何根据多列对 flex 数据网格进行排序?

我们如何在 MySQL 5.5 中快速进行此查询(按多列分组 + 排序,具有 2 个左连接)?

MySQL -通过调整索引提升查询效率

如何在 Laravel 4 中对多列使用排序依据?

如何使用 django 和 htmx 对查询集进行排序?