Django从类属性创建实例

时间:2018-05-21 12:53:14

标签: django

假设有这样一个主题模型表

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

如结构所示,textdata_addedowner是类级别属性。

但是,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如何完成如此惊人的任务?

1 个答案:

答案 0 :(得分:0)

__init__在Django源代码的Modelhere上定义。

由于您派生自Model,因此您从超类中获得__init__

当您致电QuerySet.get()时,它最终(通过QuerySet内的一些箍)调用Model.from_db()调用__init__方法(第496行)。

另外,详细说明:即使textdate_addedowner 看起来像类属性一样,它们最终也不会出现在最终的模型子类中,因为ModelBase metaclass将它们收集到新模型子类的_meta类(Options的一个实例)中。