Cada modelo de Django tiene una clave principal predeterminada id creada automáticamente. Quiero que los objetos modelo tengan otro atributo big_id que se calcula como:
big_id = id * SOME_CONSTANT

Quiero acceder a big_id como model_obj.big_id sin que la tabla de la base de datos correspondiente tenga una columna llamada big_id.

¿Es posible?

4
akv 26 oct. 2009 a las 20:30

3 respuestas

La mejor respuesta

Bueno, las instancias del modelo django son solo objetos de python, o eso me han dicho de todos modos: P

Así es como lo haría:

class MyModel(models.Model):
    CONSTANT = 1234
    id = models.AutoField(primary_key=True) # not really needed, but hey

    @property
    def big_id(self):
        return self.pk * MyModel.CONSTANT

Obviamente, obtendrá una excepción si intenta hacerlo con un modelo no guardado. También puede calcular previamente el valor de big_id en lugar de calcularlo cada vez que se accede a él.

8
shylent 26 oct. 2009 a las 17:40

Tienes dos opciones en las que puedo pensar ahora:

  1. Como no desea el campo en la base de datos, su mejor opción es definir un método en el modelo que devuelva self.id * SOME_CONSTANT, digamos que lo llama big_id (). Puede acceder a este método en cualquier momento como yourObj.big_id (), y estará disponible en plantillas como yourObj.big_id (es posible que desee leer sobre el "punto mágico" en las plantillas de django).
  2. Si no le importa que esté en la base de datos, puede anular el método de guardar en su objeto para calcular la identificación * SOME_CONSTANT y almacenarlo en un campo big_id. Esto le evitaría tener que calcularlo cada vez, ya que supongo que la ID no va a cambiar
0
Matt Baker 26 oct. 2009 a las 17:45
class Person(models.Model):
    x = 5
    name = ..
    email = ..
    def _get_y(self):
        if self.id:
            return x * self.id        
        return None
    y = property(_get_y)  
1
shanyu 26 oct. 2009 a las 17:38