一 创建数据库:
class UserApiKey(Model):
api_key = CharField(max_length=50, null=True)
create_time = DateTimeField(default=timezone.now)
关于 Model 的源码解析(元类创建一个新的类,来替代原来的类):
1, Model 继承于 ModelBase
2, ModelBase 继承与元类(type) 主要是 创建模型类的元类
1),从原始模型类的定义中获取Meta元信息, Django会尝试从中获取一些模型类的相关属性, 例如: abstract,ordering by等;
2),模型的元信息类Meta会别包装成一个特殊Options对象, 并设置在新创建的模型类对象的属性_meta上
3),为新创建模型类对象添加两个模型相关的异常类DoesNotExist和MultipleObjectsReturned
4),添加原始模型类中定义的所有属性和字段到新创建的模型类对象上
5),如果模型类没有提供一个对象管理器, 那么就设置一个名为objects的Manager默认对象管理器;
6),返回新创建的模型类, 供以后创建类的实例使用
7),综上所述,创建一个新的类,增加了若干属性
View Code
二 模型类管理器:
1, ModelBase 利用元类为模型类增加了属性objects 并指向模型类管理器对象
# 来自于 base.py 文件下 ModelBase __new__()
def _prepare(cls):
"""Create some methods once self._meta has been populated."""
opts = cls._meta
opts._prepare(cls)
"""......."""
if not opts.managers:
if any(f.name == 'objects' for f in opts.fields):
raise ValueError(
"Model %s must specify a custom Manager, because it has a "
"field named 'objects'." % cls.__name__
)
# Manager 是模型类管理器
manager = Manager()
manager.auto_created = True
# 如果没有制定模型类管理器 那么就是 cls.objects = Manager()
cls.add_to_class('objects', manager)
2, 我们可以继承 Manager 用来自定义管理器 Manager
class Manager(BaseManager.from_queryset(QuerySet)):
pass
3, from_queryset 返回的是一个又元类type定义的一个新的类,同时把QuerySet类中的多有方法等属性也添加到了这个用type新建的类
4, from_queryset 就是将Manager 与 QuerySet 两个类的属性整合到一起造了一个新的类
5, 也就是说 Manager 继承与这个新创建的类
# 来自于 manager.py 文件下 BaseManager类
@classmethod
def from_queryset(cls, queryset_class, class_name=None):
if class_name is None:
class_name = '%sFrom%s' % (cls.__name__, queryset_class.__name__)
# 使用 type 方法进行整合 到一个新的类 并且返回 继承于 cls(Basemanager)
return type(class_name, (cls,), {
'_queryset_class': queryset_class,
**cls._get_queryset_methods(queryset_class),
})
class UserManager(models.Manager):
def get_queryset(self):
# 重写 get_queryset 方法 来自于 BaseManager 类之中的方法
return super(UserManager, self).get_queryset().filter(isDelete=False)