在Django应用中,如果希望根据某字段的值对检索结果排序,比如说,按字母顺序。 那么,使用 order_by() 这个方法就可以搞定了
具体方法:
Article.objects.all().order_by("-publish_date") “publish_date"表示要进行排序的字段,连字符“-”在“publish_date”前表示降序排列。反之默认为升序。
Article.objects.all().order_by("-publish_date")[:5] 表示降序排列并只取前5位
如果我们想对文章的阅读数进行热门文章排序,按照上面的方法,得出的结果是:
Article.objects.all().order_by("-readnum")[:10]
+---------+
| readnum |
+---------+
| 9 |
| 8 |
| 7 |
| 6 |
| 55 |
| 4 |
| 3 |
| 2 |
| 111 |
| 10 |
很明显,我想要的结果应该是 111,55,10,9,8 这样的。但是这个111排在了最后,是按照字符串来排的。其实我是想把它当做数值来排。
我们手动转换类型:用下面的方法就可以搞定了
articlenum_list = models.Article.objects.extra(select={'t':'readnum+0'})
articlenum_list = articlenum_list.extra(order_by=["-t"])[:5]
如果需要以多个字段为标准进行排序(第二个字段会在第一个字段的值相同的情况下被使用到),使用多个参数就可以了,如下:
Article.objects.all().order_by("xxxxx", "xxx")
尽管很灵活,但是每次都要用 order_by() 显得有点啰嗦。 大多数时间你通常只会对某些字段进行排序。 在这种情况下,Django让你可以指定模型的缺省排序方式:
打开models.py设置参考如下:
class Article(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return self.name
**class Meta:**
**ordering = ['name']**