Модель 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 в случае, если это позиционные параметры. Но это, вероятно, не хорошая идея.

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