Суть вашего вопроса в том, «почему эти переменные класса (которым я назначаю объекты Field) вдруг становятся переменными экземпляра (которым я назначаю данные) в ORM Джанго»? Ответ на это - магия Python метаклассы .
Метакласс позволяет вам подключиться и изменить процесс создания класса Python (не создание экземпляра этого класса, создание самого класса).
Объект Model Django (и, следовательно, также ваши модели, которые являются подклассами) имеет метакласс ModelBase . Он просматривает все атрибуты класса вашей модели и любые, которые являются экземплярами подкласса Field, он перемещается в список полей. Этот список назначается в качестве атрибута объекта _meta
, который является атрибутом класса модели. Таким образом, вы всегда можете получить доступ к фактическим объектам поля через MyModel._meta.fields
или MyModel._meta.get_field('field_name')
.
Затем метод Model.__init__
может использовать список _meta.fields
, чтобы определить, какие атрибуты экземпляра следует инициализировать при создании экземпляра модели.
Не бойтесь погрузиться в исходный код Django; это отличный источник образования!