Как работает мета-класс Django?
Я использую Django, который позволяет людям добавлять дополнительные параметры в класс с помощью class Meta
.
class FooModel(models.Model):
...
class Meta:
...
единственное, что я нашел в документации Python, было:
class FooMetaClass(type):
...
class FooClass:
__metaclass__ = FooMetaClass
однако я не думаю, что это одно и то же.
4 ответов
вы задаете вопрос о двух разных вещах:
-
Meta
внутренний класс в моделях Django:Это просто контейнер класса с некоторыми параметрами (метаданными), прикрепленными к модели. Он определяет такие вещи, как доступные разрешения, связанное имя таблицы базы данных, является ли модель абстрактной или нет, сингулярная и множественная версии имени и т. д.
краткое объяснение здесь: Django docs: модели: мета опции
список доступных мета-опций здесь:Django docs: Model Meta options
-
метаклассы в Python:
лучшее описание здесь: что такое метакласс в Python?
расширение на ответ Django Тадека выше, использование "класса Meta:" в Django-это тоже обычный Python.
внутренний класс-это удобное пространство имен для общих данных между экземплярами класса (отсюда и название Meta для "метаданных", но вы можете называть его как угодно). Хотя в Django это, как правило, только для чтения конфигурации, нет ничего, чтобы остановить вас изменить его:
In [1]: class Foo(object):
...: class Meta:
...: metaVal = 1
...:
In [2]: f1 = Foo()
In [3]: f2 = Foo()
In [4]: f1.Meta.metaVal
Out[4]: 1
In [5]: f2.Meta.metaVal = 2
In [6]: f1.Meta.metaVal
Out[6]: 2
In [7]: Foo.Meta.metaVal
Out[7]: 2
вы можете исследовать его в Django напрямую тоже е.г:
In [1]: from django.contrib.auth.models import User
In [2]: User.Meta
Out[2]: django.contrib.auth.models.Meta
In [3]: User.Meta.__dict__
Out[3]:
{'__doc__': None,
'__module__': 'django.contrib.auth.models',
'abstract': False,
'verbose_name': <django.utils.functional.__proxy__ at 0x26a6610>,
'verbose_name_plural': <django.utils.functional.__proxy__ at 0x26a6650>}
однако в Django вы, скорее всего, захотите изучить что это Options
объект, созданный моделью metaclass
при создании модели. Вот где вы найдете всю "мета" информацию класса Django. В Джанго,Meta
просто используется для передачи информации в процесс создания _meta
Options
"объект".
Джанго Model
класс специально обрабатывает наличие атрибута с именем Meta
который является классом. Это не общая вещь Python.
метаклассы Python совершенно разные.
ответы, которые утверждают, что модель Django Meta
и метаклассы "совершенно разные" - это вводящие в заблуждение ответы.
строительство модели Django объекты класса (то есть объект, который обозначает само определение класса; да, классы также являются объектами) действительно управляются метаклассом ModelBase
, вы можете увидеть, что код здесь:
https://github.com/django/django/blob/master/django/db/models/base.py#L61
и одна из вещей, которые ModelBase
делает это, чтобы создать _meta
атрибут на каждой модели Django которая содержит машинное оборудование утверждения, детали поля, сохраняя машинное оборудование и так далее. И во время этой операции все, что указано в модели inner Meta
класс считывается и используется в этом процессе.
так, пока да, в некотором смысле Meta
и метаклассы-это разные "вещи", в механике построения модели Django они тесно связаны; понимание того, как они работают вместе, углубит ваше понимание обоих сразу.
это может быть полезным источником информации, чтобы лучше понять, как модели Django используют метаклассы.
https://code.djangoproject.com/wiki/DevModelCreation
и это может помочь, если вы хотите лучше понять, как работают объекты в общем.