У меня есть модель:
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 к моей проблеме?
вы делаете это странным образом. вам нужно только сохранить день рождения (что вы уже делаете).
, если вам нужно делать запросы на основе возраста, возьмите возраст, а затем выполните поиск по дням рождения, которые соответствуют требованиям.
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
вы сами сказали: «[возраст] вообще не должен храниться в базе данных»
, вы правы. нет причин для поля возраста ... просто свойство будет в порядке.