Настоящие динамические значения поля DateField в Django
Некоторые модели моего приложения определяют диапазоны дат (например, контрактов), где текущий экземпляр не имеет фиксированной даты окончания (т.е. он всегда должен оцениваться как сегодняшний). Установка параметра default
на поле end
-
class Contract(models.Model):
building = models.ForeignKey(Building, on_delete=models.CASCADE)
service = models.ForeignKey(Service, on_delete=models.CASCADE)
begin = models.DateField()
end = models.DateField(default=datetime.date.today)
- заполнит поле фиксированным значением. Свойство для обхода этой проблемы -
class Contract(models.Model):
building = models.ForeignKey(Building, on_delete=models.CASCADE)
service = models.ForeignKey(Service, on_delete=models.CASCADE)
begin = models.DateField()
end = models.DateField(blank=True)
@property
def get_end(self):
if not self.end:
return datetime.date.today()
return self.end
- не работает с кверисетами. Есть ли способ реализовать действительно динамическое значение на уровне базы данных, используя ORM Django?
Лучшими вариантами для sudo-dynamic DateField
являются auto_now
и auto_now_add
, как указано в комментариях. Первый обновляет поле DateField при каждом вызове .save()
, а второй делает это при создании (Django doc).
Другой вариант, как упомянул Адриан, заключается в том, чтобы задать end
как Null
и использовать условный запрос для вашей функции claen()
. Это можно сделать либо введя оператор if, либо используя Case()
и When()
. Вы можете посмотреть этот Django doc или увидеть этот ответ для получения дополнительной информации.
Существуют и другие варианты для получения динамической даты в вашей модели, но не в виде DateField
, что, как я предполагаю, не является тем, что вы ищете, или чем-то близким к "чистому коду".