2010-05-25 19 views
6

samouczka na stronie internetowej django pokazuje ten kod na modelach:Django modele i Python atrybuty

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() 

Teraz każdy z tych atrybutów, jest atrybutem klasy, prawda? Tak więc ten sam atrybut powinien być współużytkowany przez wszystkie wystąpienia klasy. Nieco później prezentują ten kod:

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

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

Jak zmienili atrybuty z klasy na atrybuty instancji? Czy mam błędne atrybuty klas?

Odpowiedz

4

Zobacz klasę Model w pliku django/db/models.py. Nie atrybuty klasy są włączone do instancji atrybutów poprzez coś jak

setattr(self, field.attname, val) 

One może polecić cały plik (ModelBase i Model klasy) jako doskonały hands-on przykład na metaclasses.

1

Zrobione z metaclasses - bardzo sprytne rzeczy. Polecam wspaniałą książkę Marty'ego Alchina Pro Django, jeśli chcesz dowiedzieć się więcej.

1

W Pythonie atrybutem klasy zawsze jest także atrybutem instancja:

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

Ale w Django jest dodatkowo komplikuje fakt, że klasy model ma szczególne metaclasses, więc należy być ostrożnym do swoich założeniach!