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()
。
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:如何编写查询以使用多列进行排序,通过模板显示的主要内容,如果未能解决你的问题,请参考以下文章