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

Posted

技术标签:

【中文标题】Django:如何编写查询以使用多列进行排序,通过模板显示【英文标题】:Django: How to write query to sort using multiple columns, display via template 【发布时间】:2013-12-13 22:44:04 【问题描述】:

我对 Django 很陌生,对 MVC、DB 查询没有太多经验。

我有一个 Customer 表,其中包括 customer_name、city_name 和 state_name(从外键表中提取)。在 html 中,我试图将结果显示在一个列表中,首先按 state_name 的字母顺序排序,然后是 city_name,然后是 customer_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>

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

【问题讨论】:

【参考方案1】:

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

    (模型级别)元属性ordering 如@Bithin 在他的回答中所示(更多关于django docs

    (VIEW LEVEL) 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']

希望这会有所帮助。

【讨论】:

【参考方案3】:

如果你想按“master”模型的某个字段排序,在这种情况下,你必须这样写:

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

看一下 state__state_name,第一个状态后的双 _,访问该模型的字段。

【讨论】:

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

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

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

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

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

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

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