Django,Model Class如何工作?

时间:2018-01-27 21:06:49

标签: python django inheritance

在发布这个问题之前,我已经阅读了Django官方文档,并为初学者提供了全面的解释。我已经阅读了实际模型类的代码,并在StackOverflow上进行了搜索。

在Django中使用数据库时,可以使用继承自models模块中Model类的类。这有助于程序员避免双重输入所有内容,在数据库特定语法和python之间跳转。正如我所读到的那样,每个模型继承自己的模型类会自动处理翻译问题。

这是如何工作的?模型类如何将模型属性转换为数据库列?我想从父模型类继承的一些方法能够使用每个新模型中指定的变量,但如果可能的话,想要更好的解释!

另外,为什么要写模型。模型'如果Model类在models.base?

链接到模特课程:https://docs.djangoproject.com/en/1.11/_modules/django/db/models/base/#Model

编辑:

找出models.Model工作原因的原因。

2 个答案:

答案 0 :(得分:1)

  

模型类如何将模型属性转换为数据库列?

Model类本身并没有真正进行任何转换。您创建了Model的子类,其中包含一些列信息, Django的ORM在构建与Django ORM查询相对应的数据库查询时使用的。转换由数据库驱动程序在与您的特定数据库实际通信时完成。

这是一个玩具ORM,其行为有点像Django的Model。如果您愿意,可以实施QuerySet以获得乐趣:

class Column:
    '''
    Represents a database column.

    This is used to create the underlying table in the database
    and to translate database types to Python types.
    '''

    def __init__(self, type):
        self.type = type


class Manager:
    '''
    Accessed via `YourModel.objects`. This is what constructs
    a `QuerySet` object in Django.
    '''

    def __init__(self, model):
        self.model = model

    def get(self, id):
        '''
        Pretend `YourModel.objects.get(id=123)` queries the database directly.
        '''

        # Create an instance of the model. We only keep track of the model class.
        instance = self.model()

        # Populate the instance's attributes with the result of the database query
        for name in self.model._columns:
            # Pretend we load the values from the database
            value = 123
            setattr(instance, name, value)

        # This would be done above if we actually queried the database
        instance.id = id

        # Finally return the instance of `self.model`
        return instance


class ModelBase(type):
    def __new__(cls, name, bases, attrs):
        new_cls = super().__new__(cls, name, bases, attrs)

        # The `Manager` instance is made a class attribute
        new_cls.objects = Manager(new_cls)

        # Keep track of the columns for conveniece
        new_cls._columns = {}

        for name, attr in attrs.items():
            if isinstance(attr, Column):
                new_cls._columns[name] = attr

        # The class is now ready
        return new_cls


class Model(metaclass=ModelBase):
    '''
    Django's `Model` is more complex.
    This one only uses `ModelBase` as its metaclass so you can just inherit from it
    '''
    pass


class MyModel(Model):
    id = Column(int)
    column2 = Column(float)
    column3 = Column(str)


if __name__ == '__main__':
    print(MyModel._columns)

    instance = MyModel.objects.get(id=5)
    print(instance.id)

主要功能由Model ModelBase作为元类提供。调用元类的__new__方法 当Model或任何子类被创建时(不是实例,类本身),它允许元类任意修改类。 每个Model子类都包含有关其自己的列的信息,并获取一个objects类属性,用于查询数据库。

  

另外,如果Model类在models.base?

中,为什么要写'models.Model'

models/__init__.pyModel导入models/base.py,因此您无需撰写models.base.Model

答案 1 :(得分:0)

创建模型类并运行

python manage.py makemigrations

它创建相应的脚本以在数据库中创建表。 您可以在自己的应用中找到此脚本"迁移"文件夹中。

当你跑步时

python manage.py migrate

这些脚本映射到正确的命令,并由Django在数据库上执行。