Вычтите django.db.models.DateField из даты и времени python для получения возраста - PullRequest
2 голосов
/ 21 января 2011

В django я хочу получить возраст (в днях) экземпляра класса.Я попытался сделать это, вычтя его поле даты создания с сегодняшнего дня, но, похоже, оно не работает должным образом.date.today () работает нормально, но DateField доставляет мне неприятности.Я посмотрел на его исходный код и документы django онлайн для моей версии , но я не уверен, как манипулировать им для выполнения вычитания.!

1 Ответ

1 голос
/ 21 января 2011

Ваша проблема в том, что вы пытаетесь использовать экземпляр поля вне модели для представления значения.

models.DateField - это класс, который представляет поле базы данных с типом «date». Я подозреваю, что вы собираетесь сделать одно из следующего:

  1. Просто займись математикой
  2. Работа со значением, возвращаемым моделью

В случае 1 вы вообще не хотите использовать модели Django. Все, что вам нужно и нужно - это классы обработки даты и времени в Python. Для вашего конкретного примера все, что вам нужно использовать, - это пара date объектов, и в итоге вы получите timedelta объект.

Чтобы сделать то, что вы пытались сделать в своем примере со стандартными классами Python, см. Пример ниже:

from datetime import date

birthday = date(year=2005, month=11, day=1)
today = date.today()

age = today - birthday

print age.days()

Здесь мы создаем дату со значениями даты рождения, получаем дату с сегодняшними значениями, вычитаем их, чтобы получить временную дельту, и, наконец, печатаем количество дней между двумя датами.

В случае 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 . Это тот же тип, что и у объекта даты, возвращаемого функцией date.today (), так что оператор "-" имеет смысл. Результатом операции вычитания является timedelta объект.

...