Чтобы создать объект 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, и назначает текущую дату и время к этому.