Методы создания объектов Django с сегодняшней датой по умолчанию

Чтобы создать объект Django с сегодняшней датой по умолчанию, вы можете использовать следующие методы:

Метод 1: установка значения по умолчанию в поле модели

Один из способов добиться этого — установить значение по умолчанию непосредственно в определении поля модели. Например, если в вашей модели есть поле created_at, вы можете установить значение по умолчанию timezone.now:

from django.db import models
from django.utils import timezone
class YourModel(models.Model):
    created_at = models.DateTimeField(default=timezone.now)

При такой настройке всякий раз, когда вы создаете новый объект YourModel, поле created_atбудет автоматически заполняться текущей датой и временем.

Метод 2: переопределение метода модели save()

Другой подход — переопределить метод save()вашей модели. В переопределенном методе вы можете проверить, не установлено ли еще поле create_at, а затем назначить ему текущую дату и время:

from django.db import models
from django.utils import timezone
class YourModel(models.Model):
    created_at = models.DateTimeField(blank=True, null=True)
    def save(self, *args, kwargs):
        if not self.created_at:
            self.created_at = timezone.now()
        super().save(*args, kwargs)

В этом случае поле create_atобъявляется как blank=Trueи null=True, чтобы изначально оно было пустым. Когда вы сохраняете новый объект, метод save()проверяет, установлен ли уже created_at, и назначает текущую дату и время, только если это не так.

Метод 3. Использование сигнала

Вы также можете использовать сигналы Django для автоматической установки даты по умолчанию. Сигналы позволяют определенным отправителям уведомлять группу получателей о совершении какого-либо действия. В этом случае вы можете использовать сигнал pre_save, чтобы установить поле created_atперед сохранением объекта:

from django.db import models
from django.utils import timezone
from django.dispatch import receiver
from django.db.models.signals import pre_save
class YourModel(models.Model):
    created_at = models.DateTimeField(blank=True, null=True)
@receiver(pre_save, sender=YourModel)
def set_default_created_at(sender, instance, kwargs):
    if not instance.created_at:
        instance.created_at = timezone.now()

Здесь сигнал pre_saveподключен к функции set_default_created_at, которая проверяет, не установлен ли created_at, и назначает текущую дату и время к этому.