2010-05-25 34 views
6

El tutorial en el sitio web Django muestra el código para los modelos:modelos de Django y Python

from django.db import models 

class Poll(models.Model): 
    question = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 

class Choice(models.Model): 
    poll = models.ForeignKey(Poll) 
    choice = models.CharField(max_length=200) 
    votes = models.IntegerField() 

Ahora, cada uno de los atributos, es un atributo de clase, ¿verdad? Entonces, el mismo atributo debería ser compartido por todas las instancias de la clase. Un poco más tarde, presentan este código:

class Poll(models.Model): 
    # ... 
    def __unicode__(self): 
     return self.question 

class Choice(models.Model): 
    # ... 
    def __unicode__(self): 
     return self.choice 

¿Cómo pasaron de los atributos de clase a los atributos de instancia? ¿Obtuve mal los atributos de clase?

Respuesta

4

Eche un vistazo a la clase Model en django/db/models.py. Allí los atributos de clase que se convierten a instancia atributos a través de algo así como

setattr(self, field.attname, val) 

Uno podría recomendar el archivo completo (ModelBase y Model clase) como un excelente ejemplo práctico de metaclases.

1

Se hace con metaclases: cosas muy ingeniosas. Recomiendo el excelente libro de Marty Alchin Pro Django si quieres saber más.

1

En Python, un atributo de clase es siempre también un atributo de instancia:

class C(object): 
    a = 1 
    def show_a(self): 
     print self.a # <- works 

Pero en Django que se complica aún más por el hecho de que las clases de modelo tienen metaclases especiales, así que cuidado a sus suposiciones!