一 创建数据库:

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),综上所述,创建一个新的类,增加了若干属性

django的request源码 django orm源码解析_bc

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),
        })

我们重写的管理器 UserManager 继承与新创建的类

class UserManager(models.Manager):
    def get_queryset(self):
        # 重写 get_queryset 方法 来自于 BaseManager 类之中的方法
        return super(UserManager, self).get_queryset().filter(isDelete=False)