在发布这个问题之前,我已经阅读了Django官方文档,并为初学者提供了全面的解释。我已经阅读了实际模型类的代码,并在StackOverflow上进行了搜索。
在Django中使用数据库时,可以使用继承自models模块中Model类的类。这有助于程序员避免双重输入所有内容,在数据库特定语法和python之间跳转。正如我所读到的那样,每个模型继承自己的模型类会自动处理翻译问题。
这是如何工作的?模型类如何将模型属性转换为数据库列?我想从父模型类继承的一些方法能够使用每个新模型中指定的变量,但如果可能的话,想要更好的解释!
另外,为什么要写模型。模型'如果Model类在models.base?
中链接到模特课程:https://docs.djangoproject.com/en/1.11/_modules/django/db/models/base/#Model
编辑:
找出models.Model工作原因的原因。
答案 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__.py
从Model
导入models/base.py
,因此您无需撰写models.base.Model
。
答案 1 :(得分:0)
创建模型类并运行
时 python manage.py makemigrations
它创建相应的脚本以在数据库中创建表。 您可以在自己的应用中找到此脚本"迁移"文件夹中。
当你跑步时
python manage.py migrate
这些脚本映射到正确的命令,并由Django在数据库上执行。