Por fin después de mucho batallar ya encontramos el resultado de esta pregunta que algunos de nuestros usuarios de este sitio web presentan. Si tienes algún detalle que aportar no dejes de aportar tu comentario.
Solución:
Tienes que anular el save
método de tu modelo Person
y crear unique_id
y age
campo en el Modelo.
from dateutil.relativedelta import relativedelta
from datetime import datetime
class Person(model.Model)
unique_id = models.CharField(max_length=25)
age = models.IntegerField()
last_name = models.CharField(max_length=25)
birth_date = models.DateField()
city_of_birth = models.CharField(max_length=25)
@property
def get_unique_id(self):
a = self.last_name[:2].upper() #First 2 letters of last name
b = self.birth_date.strftime('%d') #Day of the month as string
c = self.city_of_birth[:2].upper() #First 2 letters of city
return a + b + c
@property
def get_age(self):
return relativedelta(self.birth_date.days, datetime.date.now()).years
def save(self, *args, **kwargs):
self.unique_id = self.get_unique_id
self.age = self.get_age
super(Person, self).save(*args, **kwargs)
ACTUALIZACIÓN: Anteriormente el self.get_unique_id
y self.get_age
estaban siendo llamados con ‘()’ que no es necesario para las propiedades de clase.
Un modelo tiene un clean
método para este tipo de cosas:
Este método debe usarse para proporcionar una validación de modelo personalizada y para modificar attributes en su modelo si lo desea. Por ejemplo, puede usarlo para proporcionar automáticamente un valor para un campo o para realizar una validación que requiera acceso a más de un solo campo.
Así que suelte la propiedad y agregue un campo llamado ‘unique_id’ que debería ser un CharField. Rebautizar get_id
a clean
y reemplace la declaración de devolución con:
self.unique_id = a + b + c
Si está seguro de que esto siempre genera un único stringconsidere hacer de este campo el principal key. Sin embargo, si este modelo ya se migró, no puede nombrarlo id
ya que Django ya ha creado un campo id
como un AutoField
para usted, por lo que tomará dos migraciones si está configurado en el nombre ‘id’ (que puede aplastar más tarde).
valoraciones y reseñas
Ten en cuenta dar recomendación a este artículo si te valió la pena.