Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

498
Views
¿Cómo agregar un método personalizado a un campo modelo en Django?

Tengo dos modelos que usarán el mismo CardNumberField() para almacenar números de tarjetas de crédito. ¿Cómo puedo agregar un método personalizado al campo para enmascarar los números de tarjeta?

He creado CardNumberField() que hereda de models.Charfield :

 # CARD NUMBER FIELD class CardNumberField(models.CharField): description = _('card number') def __init__(self, *args, **kwargs): kwargs['max_length'] = 19 super().__init__(*args, **kwargs)

CardNumberField() se importa y se usa en mi clients/models.py :

 # CARD MODEL class Card(models.Model): number = CardNumberField() ... def __str__(self): return 'Card [{number}]'.format(number=self.number)

... y en mis transacciones/modelos.py :

 # TRANSACTION MODEL class Transaction(models.Model): card_number = CardNumberField() ... def __str__(self): return 'Transaction ...'

Entonces, ¿cómo puedo agregar el siguiente método a mi CardNumberField() para que lo usen mis dos modelos?

 def masked_number(self): # display masked card number number = self.number return number[-4:].rjust(len(number), '#')

Además, ¿cómo tomaré este método de campo en una clase de serializador DRF?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Puede anular el método contribute_to_class no solo para contribuir con el campo, sino también para incluir un método adicional:

 from functools import partialmethod def _mask_number(self, field): number = getattr(self, field.attname) return number[-4:].rjust(len(number), '#') # CARD NUMBER FIELD class CardNumberField(models.CharField): description = _('card number') def __init__(self, *args, **kwargs): kwargs['max_length'] = 19 super().__init__(*args, **kwargs) def contribute_to_class (self, cls, name, **kwargs): super().contribute_to_class(cls, name, **kwargs) setattr( cls, f'masked_{self.name}', partialmethod(_mask_number, field=self) )

Si agrega un campo foo a una clase modelo, automáticamente agregará un método masked_ foo a esa clase. Esto también significa que si tiene dos o más CardNumberField s, agregará dos o más métodos masked_ foo .

over 4 years ago · Santiago Trujillo Report

0

Utilice un modelo abstracto en su lugar:

 class ModelWithCardNumber(models.Model): card_number = models.CharField(max_length=19) @property def masked_number(self): return self.card_number[-4:].rjust(len(number), '#') class Meta: abstract = True class Card(ModelWithCardNumber): def __str__(self): return 'Card [{number}]'.format(number=self.number) class Transaction(ModelWithCardNumber): def __str__(self): return 'Transaction ...'

Ahora en su serializador puede acceder a Card.masked_number y Transaction.masked_number .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!