Discuss / Python / ORM模型中的疑惑

ORM模型中的疑惑

q可爱嗄

#1 Created at ... [Delete] [Delete and Lock User]

按照理解:第一步定义元类也就是 class ModelMetaclass(type) 第二步 使用元类创建类 class Model(dict): metaclass = ModelMetaclass 就是model类集成dict类,同时使用元类对Model类进行创建 第三步 创建实例 class User(Model): id = IntegerField('uid') name = StringField('username') email = StringField('email') password = StringField('password') 这里面使用User集成Model类,User也就使用元类来创建了,但是id name email password 都是User类的类属性,为什么使用类属性,这四个字段属性 怎么通过attrs进去的 可是就是不理解啊? 将这四个定义为User的实例属性 为何就不行呢?为何此处要用类属性?还是使用元类的创建新类 都需要用类属性?求廖老师解答。。。

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

如果不使用metaclass,User类就会有4个类属性,但是metaclass可以改变创建类的行为,attrs包含User类的所有类属性,metaclass从里面读取到4个Field,并从atts中删除,又添加了__table____mappings__,__primary_key__这3个类属性,所以User类实际上只有这3个类属性。

创建User实例时,super的init可以从User类读取类属性,获得__table____mappings__,__primary_key__,也就获得了创建SQL的所有信息。

为啥要把几个字段放到User的类属性中?因为需要一个地方来定义ORM的映射信息,可以放到其他地方,但是为了方便metaclass读取,放到类属性里最方便,而且使用者只需要看看User类的定义就知道表的结构了。


  • 1

Reply