I have a problem with re-assigning some var in my model, I have a model like this:
JavaScript
x
15
15
1
class ExpireTime(models.Model):
2
"""Expire time fields and methods in abstract mode"""
3
4
def expire_time():
5
return create_expire_time(seconds=10)
6
7
expire = models.DateTimeField(default=expire_time)
8
9
def is_expired(self) -> bool:
10
return self.expire < timezone.now()
11
12
class Meta:
13
abstract = True
14
15
but in the different models that used this abstract model, I need the use different expiration times in the exprie_time:
JavaScript
1
3
1
def expire_time():
2
return create_expire_time(seconds=10)
3
so I am trying to overwrite this method in the model that was inherited from ExpireTime but it has no effect.
so how can I solve this situation? Should I not use the abstract model in this situation?
Update:
the model that was inherited from ExpireTime :
JavaScript
1
14
14
1
class TempLink(ExpireTime, models.Model):
2
"""Temp link for provide some files with security"""
3
4
# Needs 10 sec expiration time
5
6
link = models.UUIDField(
7
primary_key=True, default=uuid4, editable=False, unique=True
8
)
9
ip = models.GenericIPAddressField()
10
file = models.FileField()
11
12
def is_valid_ip(self, ip: models.GenericIPAddressField) -> bool:
13
return ip == self.ip
14
JavaScript
1
21
21
1
class UserConfirm(ExpireTime, models.Model):
2
"""confirm user activate wiht random code"""
3
4
# needs 120 sec expiration time
5
6
LENGTH_CODE: int = 5
7
8
# Generate Random Code Between 0 to 9
9
def generate_code() -> str:
10
code = "".join(
11
[str(random.randint(0, 9)) for _ in range(UserConfirm.LENGTH_CODE)]
12
)
13
return code
14
15
user = models.OneToOneField(NewUser, on_delete=models.CASCADE)
16
code = models.CharField(max_length=LENGTH_CODE, default=generate_code, unique=True)
17
token = models.UUIDField(default=uuid4, unique=True)
18
19
def is_valid_code(self, input_code):
20
return input_code == self.code
21
Advertisement
Answer
you can always do it on save:
JavaScript
1
17
17
1
class ExpireTime(models.Model):
2
default_expired = 10
3
4
expire = models.DateTimeField(null=True, blank=true)
5
6
class Meta:
7
abstract = True
8
9
def save(self, *args, **kwargs):
10
if not self.expire:
11
self.expire = create_expire_time(seconds=self.default_expired)
12
super().save(*args, **kwargs)
13
14
15
class OtherExpireTime(ExpireTime):
16
default_expired = 20
17