Как сделать модель Django полями вычисленный во времени выполнения?

У меня есть модель:

class Person (models.Model):
    name     = models.CharField ()
    birthday = models.DateField ()
    age      = models.IntegerField ()

Я хочу сделать age поле для поведения как свойство:

    def get_age (self):
        return (datetime.datetime.now() - self.birthday).days // 365

    age = property (get_age)

но в то же время мне нужно age быть истинным полем, таким образом, я могу найти его в Person._meta.fields, и присвойте атрибуты ему: age.help_text = "Age of the person", и т.д.

Очевидно, я не могу просто переопределить Person.save() метод, чтобы вычислить и сохранить age в базе данных, потому что это неизбежно станет неправильно позже (на самом деле, это не должно быть сохранено в базе данных вообще).

На самом деле у меня не должно быть методов set теперь, но хорошее решение должно иметь функцию установки.

Действительно ли это возможно в Django, или вероятно существует больше подхода pythonic и djangoic к моей проблеме?

6
задан jeremysprofile 29 April 2019 в 17:58
поделиться

1 ответ

вы делаете это странным образом. вам нужно только сохранить день рождения (что вы уже делаете).

, если вам нужно делать запросы на основе возраста, возьмите возраст, а затем выполните поиск по дням рождения, которые соответствуют требованиям.

from datetime import datetime

# get people over 50
age = 50 # in years
age_ago = datetime.now() - age # use timedelta i don't know the syntax off the top of my head
Person.objects.filter(birthday__lte=age_ago) # people whose birthday is before fifty years ago

вы сами сказали: «[возраст] вообще не должен храниться в базе данных»

, вы правы. нет причин для поля возраста ... просто свойство будет в порядке.

3
ответ дан 17 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: