Saltar al contenido

Método del modelo Django o cálculo como campo en la base de datos

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 idya 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *