Созданное поле(DateTimeField) auto_now_add=True не работает в абстрактном классе в Django
class TimeStampMixin(models.Model):
id = models.CharField(max_length=60,editable=False,primary_key=True,default=generate_unique_id)
created = models.DateTimeField(editable=False)
modified = models.DateTimeField(auto_now=True)
def save(self, *args, **kwargs):
if not self.id:
print("SAVING WHILE CREATE")
self.created = timezone.now()
print("MODIFY WHILE UPDATE")
self.modified = timezone.now()
return super().save(*args, **kwargs)
class Meta:
abstract = True
class Sport(TimeStampMixin):
name = models.CharField(max_length=100, unique=True)
image = models.ImageField(upload_to=path_and_rename,null=True,blank=True)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.name = self.name.upper()
return super(Sport, self).save(*args, **kwargs)
Пояснение
Я создал абстрактную модель TimeStampMixin с пользовательским методом сохранения.
Затем я унаследовал от модели TimeStampMixin модель Sport.
Теперь всякий раз, когда я создаю объект Sport, он поднимает django.db.utils.IntegrityError: null value in column "created" of relation "events_sport" violates not-null constraint DETAIL: Failing row contains (id, Test, image,2022-04-10 13:30:00+00, 2022-04-10 14:30:00+00, 2022-04-10 12:00:00+00).
Также не вызывается метод сохранения Custom save из timestampmixin. (Не печатает ничего).
Решение, которое мне нужно: При обновлении объекта созданное поле также обновляется. auto_now_add=True в атрибуте datetimeField не работает!!!. Как это предотвратить?
Попробуйте if self._state.adding:
вместо if not self.id:
.
Примечание: если вы используете auto_now
, вы не сможете установить новое значение для этого поля. Следуя документу "это не просто значение по умолчанию, которое вы можете переопределить". https://docs.djangoproject.com/en/3.2/ref/models/fields/#django.db.models.DateField.auto_now
Я сбросил базу данных и использую этот код
class TimeStampMixin(models.Model):
id = models.CharField(max_length=60,editable=False,primary_key=True,default=generate_unique_id)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
У меня работает нормально!