整个Django框架,如果要问喜欢那部分,我首先想到的就是它的ORM;Django集成的ORM好用,秉承了Pythonic的理念,还有很浓的OO味道。单个看ORM的函数,似乎是管中窥豹,如果你把各种函数组合起来写,你会发现,原来也可以这么用的,太酷了吧?但还是单独看看这些函数的,等你逐个了解了,一气呵成的感觉就有了。
拾遗,随意拿些函数来说说,读者只需了解,理念就形成了,有兴趣的稍微记忆下,就是自己的东西了。
1.annotate
说到annotate,不能提到聚合aggregate(Avg,Count,Max,Min...),因为annotate需要结合这些聚合函数,才能发挥它的作用,比如博客应用,博客和博客的回复Commnet,取出博客列表的同时,你如果也要取出回复的条数,应该怎么写呢:
blogs = Blog.objects.annotate(Count('commnet'))
这回取出博客列表的同时,也能取到相应的回复条数了。template中怎么取值:
{%for blog in blogs%}
{{blog.comment__count}}
{%endfor%}
你也可以该字段给个别名:
blogs = Blog.objects.annotate(comment_count=Count('commnet'))
这个函数,如果结合filter exclude get,出来的效果你懂的!
2 values
values是返回QuerySet吗?严格说是ValuesQuerySet,是QuerySet的子集。看代码:
Blog.objects.values()
得出的是:
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'},...]
没有指定参数,默认会返回全部的字段字典列表。指定参数:
Blog.objects.values('id', 'name')
得出:
[{'id': 1, 'name': 'Beatles Blog'}]
在template里使用它 只需把它当成一个iterable,循环取值即可,每条记录就是一个字典,记录的属性就是实体的属性字段。
值得注意的是它返回的是ValuesQuerySet,而不是QuerySet,如果你使用了values()后,再使用QuerySet的函数如filter,出现什么问题,你可以试试。
3 dates
顾名思义,dates是和时间有关的函数,用法:
Entry.objects.dates('pub_date', 'year')
结果:
[datetime.datetime(2005, 1, 1),...]
得出的是时间datetime列表,和values函数相似,得出的是QuerySet的子集:DateQuerySet;这个函数不好理解,如上面的Entry.objects.dates('pub_date', 'year'),是什么意思呢?Blog.objects.dates('pub_date', 'month', order='DESC')...
结果:
[datetime.datetime(2005, 1, 1),datetime.datetime(2005, 2, 1),... ,datetime.datetime(2006, 4, 1),...,datetime.datetime(2008, 6, 1),...]