理解Django的模型类

时间:2014-11-17 22:36:48

标签: python django oop

我是Python和Django的新手,我试图了解Django的模型类(以及一般的类)是如何工作的。

如果您创建新模型:

from django.db import models   

class Book(models.Model): 
  title = models.CharField(max_length=200)
  author = models.CharField(max_length=200)

现在你可以做以下事情:

>>> from myapp.models import Book
>>> book = Book(title="a new book", author="bob")
>>> book.save()
>>> print book.title
a new book

很好,它有效。但是Book类从Model类继承的方式有点令人困惑。似乎标题和作者充当实例变量,但是看看类定义它们看起来是静态的。

from django.db import models 

class Book(models.Model):

  def __init__(self, *args, **kwargs):
    self.title = models.Charfield(max_length=200)
    self.author = models.CharField(max_length=200)
    super(Book, self).__init__()

对我而言,这似乎是更直观的声明类的方法,但是当我运行迁移时,Django不会选择这些架构更改。我理解为什么这不起作用,我只是不确定我理解为什么上面的方法 工作。

提前致谢。

2 个答案:

答案 0 :(得分:1)

在这里的问题中,这真的太复杂了。答案很简单,它都是用元类完成的,但是为了完整的解释,你应该阅读Marty Alchin的书 Pro Django

关键是你不希望self.title成为一个字段实例:你希望它是标题的。因此,(简化相当多)当从数据库构造模型实例时,元类通过类级别的Field属性,并且对于每个属性,它将实例级属性设置为db列的值。当然,在保存时,它会反过来。

答案 1 :(得分:0)

python中的

类以及如何定义django中的模型是不同的。 django中模型的定义只是使用python的语法作为字段和数据库相关信息的描述语言,然后django内省了提取此信息的类。但是对于其余的它是一个普通的python类,你可以定义方法等......