Как изменить функцию create в менеджере моделей Django

Итак, у меня есть такая модель:

class Token(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=False)
    code = models.IntegerField(default=code)
    date_created = models.DateTimeField(auto_now_add=True)
    expiration_date = models.DateTimeField(null=False, blank=True)

Как вы можете видеть, у меня есть поле expiration_date. Причина, по которой я установил его в (null=False, blank=True), заключается в том, что я хочу, чтобы оно само заполнялось на основе поля date_created, и я пытаюсь сделать это из метода создания менеджера модели

У меня практически нет опыта работы с менеджером моделей, за исключением менеджера пользовательских моделей. Вот моя первая неудачная попытка:

class TokenManager(models.Manager):

    def create(self, user, code, date_created):

        exp = date_created + datetime.timedelta(minutes=10)

        token = self.model(user=user, code=code, date_created=date_created, expiration_date=exp)

        token.save()

        return token

В основном моя цель состоит в том, чтобы получить значение поля date_created, добавить значение на 10 минут и установить его как expiration_date. может ли кто-нибудь помочь мне с этим?

Здесь нет необходимости использовать ModelManger. Вы можете просто установить expiration_date на основе поля date_created, перезаписав метод save.

Редактирование: Невозможно использовать self.date_created datetime в методе сохранения. Однако можно использовать django.utils.timezone.now(), который также используется auto_now_add .

from django.utils import timezone

class Token(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=False)
    code = models.IntegerField(default=code)
    date_created = models.DateTimeField(auto_now_add=True)
    expiration_date = models.DateTimeField(null=False, blank=True)
    
    def save(self, *args, **kwargs):
        # Set the expiration_date based on the value of auto_now_add
        self.expiration_date  = timezone.now() + datetime.timedelta(minutes=10)
        super(Token, self).save(*args, **kwargs)

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