假设有这样一个主题模型表
class Topic(models.Model):
"""A topic the user is learning about."""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(User)
def __str__(self):
"""Return a string representation of the model."""
return self.text
如结构所示,text
,data_added
,owner
是类级别属性。
但是,Django能够从类属性
创建实例In [21]: Topic.objects.create(text='Celery', owner_id=1)
Out[21]: <Topic: Celery>
In [34]: celery = Topic.objects.get(pk=22)
In [35]: isinstance(celery, Topic)
Out[35]: True
我认为应该有启动流程def __init__()
Django如何完成如此惊人的任务?
答案 0 :(得分:0)
__init__
在Django源代码的Model
类here上定义。
由于您派生自Model
,因此您从超类中获得__init__
。
当您致电QuerySet.get()
时,它最终(通过QuerySet
内的一些箍)调用Model.from_db()
调用__init__
方法(第496行)。
另外,详细说明:即使text
,date_added
和owner
看起来像类属性一样,它们最终也不会出现在最终的模型子类中,因为ModelBase
metaclass将它们收集到新模型子类的_meta
类(Options
的一个实例)中。