У меня есть следующая модель, и я хочу добавить следующий август (в полночь) в качестве значения по умолчанию для offer_start
:
class Offer(models.Model):
"""
A table to store all available offers for an upcoming season
"""
club = models.ForeignKey(Club, on_delete=models.CASCADE, related_name='offer')
season_start = models.CharField(max_length=40)
seasons_duration = models.IntegerField()
offer_start = models.DateTimeField(auto_now_add=False, default= ???)
roi_goal = models.FloatField()
roi_point = models.FloatField()
def __str__(self):
return f'Offer by {self.club} for season {self.season_start}'
Есть ли способ сделать такую спецификацию?
Да, вы можете сделать вызов с помощью:
from django.utils.timezone import now
def next_august_1():
today = now().date()
if (today.month, today.day) >= (8, 1):
return datetime(today.year+1, 8, 1)
return datetime(today.year, 8, 1)
а затем передайте вызываемый объект DateTimeField
:
class Offer(models.Model):
# …
# without parenthesis ?
offer_start = models.DateTimeField(default=next_august_1)
@Jonas: обычно над моделью. Вы должны не вызывать функцию, а передавать ссылку на функцию, чтобы каждый раз, когда вы создаете Offer
, она оценивала функцию и использовала результат. Это необходимо, так как в противном случае он принимает значение, когда вы началось сервер, а не когда вы создаете Offer
.
хорошо работает, спасибо! Два вопроса: почему я вызываю функцию без круглых скобок и где я обычно размещаю такие функции/вызываемые объекты в моем models.py? Все в самом верху или ниже/выше связанной модели?