Причина, по которой это не сработает, состоит в том, что вы вызываете функцию. Таким образом, это означает, что datetime
оценивается при интерпретации класса, так что в основном это происходит при запуске сервера. В этот момент freezegun еще не активен.
Таким образом, это также означает, что если вы позже запустите сервер в течение некоторого времени, и год будет увеличиваться, он все равно будет использовать старое значение.
Вы можете передать вызываемый объект в значение по умолчанию и, таким образом, использовать вспомогательную функцию, например:
def quarter_results_date(month):
yr = datetime.datetime.now().year
__, dy = calendar.monthrange(yr, month)
return datetime.datetime(
yr,
month,
dy
)
def <b>quarter_results_date_first</b>():
return quarter_results_date(1)
class Company(models.Model):
q1_results_date = models.DateField(
verbose_name='Q1 financial results',
default=<b>quarter_results_date_first</b>,
blank=False,
null=False,
)
Обратите внимание, что для default=quarter_results_date_first
скобки не используются, поэтому мы передаем ссылку на функцию , а не значение даты и времени.