Созданное поле(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

У меня работает нормально!

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