Будет ли динамический список вариантов в модели Django оцениваться при миграции модели или при попытке пользователя выбрать вариант для модели?
Код
Допустим, у меня есть следующая модель:
class Course(models.Model):
title = models.CharField(max_length=48)
YEAR_CHOICES = [(r, r) for r in range(
datetime.date.today().year-1, datetime.date.today().year+2
)
]
year = models.IntegerField(_('year'), choices=YEAR_CHOICES)
Вопрос
Будут ли операторы datetime.date.today()
оцениваться непосредственно при переносе модели, или они будут оцениваться каждый раз, когда пользователь обращается к форме, чтобы установить значение year
для модели Course
?
Другими словами, мой YEAR_CHOICES
код выше застыл на моменте миграции модели или он будет динамически обновляться с течением времени?
Результаты тестирования
Я провел тестирование, используя минуты вместо лет, и результаты оказались довольно удивительными:
Заданная функция...
from django.db import models
import datetime
def minute_choices_range():
now_minute = datetime.datetime.now().minute
return [(r, r) for r in range(
now_minute-1, now_minute+2
)
]
Постоянно обновляется
(значения времени, которые синхронизировались со временем обращения к странице)
class Course(models.Model):
minute = models.IntegerField(choices=minute_choices_range)
Застрял на время миграции
(Значения времени, которые застряли на момент миграции модели)
class Course(models.Model):
minute = models.IntegerField(choices=minute_choices_range())
И учитывая эту функцию...
from django.db import models
import datetime
def current_min():
return datetime.datetime.now().minute
Застрял на время миграции
(Значения времени, которые застряли на момент миграции модели)
class Course(models.Model):
MINUTE_CHOICES = [(r, r) for r in range(
current_min()-1, current_min()+2
)
]
minute = models.IntegerField(choices=MINUTE_CHOICES)
А вот с этой функцией у меня не сложилось, но она тоже привела к "застрявшему времени" (время, которое застряло на времени миграции)
class Course(models.Model):
MINUTE_CHOICES = [(r, r) for r in range(
datetime.datetime.now().minute-1, datetime.datetime.now().minute+2
)
]
minute = models.IntegerField(choices=MINUTE_CHOICES)