Модель Django, если конструктор вызывается с None, то устанавливается выбранное значение
У меня есть:
class Scanned(models.Model):
time = models.DateTimeField(default=datetime.now(timezone.utc), null=False)
а в моих модульных тестах есть инстансы вида:
Scanned(time=None)
Я хотел бы, чтобы этот инстанс устанавливал значение времени в datetime.now(timezone.utc)
Я пробовал:
time = models.DateTimeField(auto_now_add = True)
и
time = models.DateTimeField(auto_now = True)
Я также просмотрел валидаторы, но не смог найти способ передать datetime.now() в качестве значения, если None.
Я думаю, что это не хорошая идея, так как вы можете захотеть установить None
явно. Если вы действительно хотите это сделать, вы можете переопределить конструктор и использовать:
from django.models import DEFERRED
class Scanned(models.Model):
time = models.DateTimeField(default=datetime.now(timezone.utc), null=False)
def __init__(self, *args, **kwargs):
return super().__init__(
*[arg if arg is not None else DEFERRED for arg in args],
**{k: v for k, v in kwargs.items() if v is not None}
)
и все. По сути, это удаление элементов, которые являются None
, или помещение DEFERRED
в случае, если это позиционные параметры. Но это, вероятно, не хорошая идея.