3

在 django 中,我想获取一个类实例的年龄(以天为单位)。我尝试通过从今天减去其创建日期字段来做到这一点,但它似乎无法正常工作。date.today() 工作正常,但 DateField 给我带来了麻烦。我查看了我的版本的源代码和在线 django 文档,但我不确定如何操作它来执行减法。

import datetime.date
from django.db import models

class MyItem(models.Model):
    item_name = models.CharField(max_length = 30)
    creation_date = models.DateField()

    def age(self):
        return date.today() - creation_date

my_first_item = MyItem(item_name = 'First', creation_date = '2005-11-01')

print my_first_item.age.days

任何投入将不胜感激!

4

1 回答 1

2

您的问题是您试图使用模型外部的字段实例来表示一个值。

models.DateField 是一个类,它表示具有“日期”类型的数据库字段。我怀疑您正在寻求执行以下操作之一:

  1. 直接做日期数学
  2. 使用模型返回的值

在 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对象。

于 2011-01-21T02:11:33.530 回答