Настоящие динамические значения поля 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, что, как я предполагаю, не является тем, что вы ищете, или чем-то близким к "чистому коду".

Вернуться на верх