有人员模型如下:
class Person(models.Model):
name = models.CharField(max_length=16, verbose_name='姓名')
birthday = models.DateField(verbose_name='出生日期')
目标是高效的返回每个人员的年龄.
入门的方法是获取Queryset后,循环计算年龄, 效率较低.
好的方法是利用数据库提供的函数来计算年龄,例如PostgreSQL 提供了AGE函数, 可以这样使用:
from django.db.models import Func
class Age(Func):
function = 'AGE'
template = "EXTRACT(YEAR FROM (%(function)s(current_date,%(expressions)s)))"
Person.objects.annotate(age=Age('birthday')).values('id', 'name', 'age')
这里使用了 Django 的 Func API, 利用 template 属性来提取age中的年份来作为年龄.
网友评论