Django中对数据查询结果进行排序的方法
在你的Django应用中,你或许希望根据某字段的值对检索结果排序,比如说,按字母顺序。那么,使用order_by()这个方法就可以搞定了。
>>>Publisher.objects.order_by("name") [<Publisher:Apress>,<Publisher:O'Reilly>]
跟以前的all()例子差不多,SQL语句里多了指定排序的部分:
SELECTid,name,address,city,state_province,country,website FROMbooks_publisher ORDERBYname;
我们可以对任意字段进行排序:
>>>Publisher.objects.order_by("address") [<Publisher:O'Reilly>,<Publisher:Apress>] >>>Publisher.objects.order_by("state_province") [<Publisher:Apress>,<Publisher:O'Reilly>]
如果需要以多个字段为标准进行排序(第二个字段会在第一个字段的值相同的情况下被使用到),使用多个参数就可以了,如下:
>>>Publisher.objects.order_by("state_province","address") [<Publisher:Apress>,<Publisher:O'Reilly>]
我们还可以指定逆向排序,在前面加一个减号-前缀:
>>>Publisher.objects.order_by("-name") [<Publisher:O'Reilly>,<Publisher:Apress>]
尽管很灵活,但是每次都要用order_by()显得有点啰嗦。大多数时间你通常只会对某些字段进行排序。在这种情况下,Django让你可以指定模型的缺省排序方式:
classPublisher(models.Model): name=models.CharField(max_length=30) address=models.CharField(max_length=50) city=models.CharField(max_length=60) state_province=models.CharField(max_length=30) country=models.CharField(max_length=50) website=models.URLField() def__unicode__(self): returnself.name **classMeta:** **ordering=['name']**
现在,让我们来接触一个新的概念。classMeta,内嵌于Publisher这个类的定义中(如果classPublisher是顶格的,那么classMeta在它之下要缩进4个空格--按Python的传统)。你可以在任意一个模型类中使用Meta类,来设置一些与特定模型相关的选项。在附录B中有Meta中所有可选项的完整参考,现在,我们关注ordering这个选项就够了。如果你设置了这个选项,那么除非你检索时特意额外地使用了order_by(),否则,当你使用Django的数据库API去检索时,Publisher对象的相关返回值默认地都会按name字段排序。