您的问题是您试图使用模型外部的字段实例来表示一个值。
models.DateField 是一个类,它表示具有“日期”类型的数据库字段。我怀疑您正在寻求执行以下操作之一:
- 直接做日期数学
- 使用模型返回的值
在 1 的情况下,你根本不想使用 Django 的模型。您需要和想要的只是 python 的日期和时间处理类。对于您的具体示例,您只需要使用一对日期对象,您最终将得到一个timedelta对象。
要使用 python 标准类执行您在示例中尝试执行的操作,请参见以下示例:
from datetime import date
birthday = date(year=2005, month=11, day=1)
today = date.today()
age = today - birthday
print age.days()
这里我们用生日值实例化一个日期,我们用今天的值得到一个日期,减去它们得到一个 timedelta,最后打印两个日期之间的天数。
在 2 的情况下,我们来看一个示例模型:
class Person(models.Model):
name = models.CharField(max_length=100)
birthday = models.DateField()
这里我们有一个模型,我们使用 models.CharField 和 models.DateField 来描述数据库中的一个表,其中包含一个“varchar”列和一个“date”列。当我们使用 ORM 获取这个模型的实例时,Django 会处理将数据库返回的任何值转换为本机数据类型。现在让我们看一些计算一个人实例年龄的代码:
from datetime import date
from myapp.models import Person
person = Person.objects.get(id=1)
age = date.today() - person.birthday
print age.days
在这里你可以看到我们从数据库中获取了一个人模型的实例,然后我们从今天减去他们的生日。我们可以在这里做到这一点,因为当我们访问“person.birthday”时,Django 正在将数据库返回的任何值转换为 python日期对象。这与“date.today()”返回的日期对象类型相同,因此“-”运算符有意义。减法运算的结果是一个timedelta对象。