Вычтите 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. Просто делай математику
  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()

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

В случае 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.

Посмотрите на дельту времени. Должно сделать это немного проще

Другие вопросы по тегам