5.13. Models Method SaveΒΆ

>>> 
... import re
... from django.core.validators import MinValueValidator, MaxValueValidator
... from django.db import models
... from django.utils.translation import gettext_lazy as _
...
...
... class PhoneType(models.TextChoices):
...     HOME = 'home', _('Home')
...     WORK = 'work', _('Work')
...     MOBILE = 'mobile', _('Mobile')
...
...
... class CountryCode(models.IntegerChoices):
...     USA = 1, _('(+1) USA')
...     POLAND = 48, _('(+48) Poland')
...
...
... class Phone(models.Model):
...     customer = models.ForeignKey(verbose_name=_('Customer'), to='shop.Customer', on_delete=models.CASCADE, null=False, blank=False)
...     type = models.CharField(verbose_name=_('Type'), max_length=10, choices=PhoneType, null=False, blank=False, default=PhoneType.HOME)
...     country_code = models.PositiveSmallIntegerField(verbose_name=_('Country Code'), validators=[MinValueValidator(1), MaxValueValidator(9999)], choices=CountryCode, null=True, blank=True, default=None)
...     number = models.CharField(verbose_name=_('Number'), max_length=20, null=False, blank=False, default=None)
...     normalized = models.CharField(verbose_name=_('Normalized'), max_length=20, null=False, blank=False, default=None, editable=False)
...
...     def save(self, *args, **kwargs):
...         normalized = re.findall(r'\d+', self.number)
...         normalized = ''.join(normalized)
...         self.normalized = f'{self.country_code}{normalized}'
...         super().save(*args, **kwargs)
...
...     def __str__(self):
...         return f'{self.number}'
...
...     class Meta:
...         app_label = 'contact'
...         verbose_name = _('Phone')
...         verbose_name_plural = _('Phones')
...