Ваша проблема в том, что вы пытаетесь использовать экземпляр поля вне модели для представления значения.
models.DateField - это класс, который представляет поле базы данных с типом «date». Я подозреваю, что вы собираетесь сделать одно из следующего:
- Просто займись математикой
- Работа со значением, возвращаемым моделью
В случае 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 объект.