Вычтите django.db.models.DateField из даты и времени python для получения возраста
В 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
Любой вклад будет принята с благодарностью!
1 ответ
Ваша проблема в том, что вы пытаетесь использовать экземпляр поля вне модели для представления значения.
models.DateField - это класс, который представляет поле базы данных с типом "date". Я подозреваю, что вы собираетесь сделать одно из следующего:
- Просто делай математику
- Работа со значением, возвращаемым моделью
В случае 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()
Здесь мы создаем дату со значениями даты рождения, получаем дату с сегодняшними значениями, вычитаем их, чтобы получить временную дельту, и, наконец, печатаем количество дней между двумя датами.
В случае 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.
Посмотрите на дельту времени. Должно сделать это немного проще