model教學 Django模型和Python類屬性



django orm (4)

django網站上的教程顯示了這些模型的代碼:

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

現在,每個屬性都是一個類屬性,對嗎? 所以,類的所有實例都應該共享相同的屬性。 稍後,他們提出這個代碼:

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

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

他們是如何從類屬性轉換為實例屬性的? 我的課程屬性錯了嗎?


Answer #1

在Python中,類屬性總是也是一個實例屬性:

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

但是在Django中,由於Model類有特殊的元類,所以要小心你的假設!


Answer #2

看一下django / db / models.py下的Model類。 那裡的類屬性通過類似的東西變成實例屬性

setattr(self, field.attname, val)

我們可以推薦整個文件( ModelBaseModel類)作為元類的一個很好的動手實例。



Answer #4

它是用元類完成的 - 非常聰明的東西。 如果你想了解更多,我會推薦Marty Alchin的優秀書籍Pro Django。





attributes