Как работает мета-класс 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 это, как правило, только для чтения конфигурации вещи, нет ничего, чтобы остановить вас изменить его:
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используется только для передачи информации в процессе создания_metaOptions"объект".
Джанго
Modelкласс специально обрабатывает атрибут с именемMetaкоторый является классом. Это не общая вещь питона.метаклассы Python совершенно разные.
ответы, которые утверждают, что модель Django
Metaи метаклассы "совершенно разные" вводят в заблуждение ответы.построение модели Django объекты класса (то есть объект, который обозначает само определение класса; да, классы также являются объектами) действительно управляются метаклассом под названием
ModelBase, вы можете увидеть, что код здесь:https://github.com/django/django/blob/master/django/db/models/base.py#L61
и одна из вещей, которые
ModelBaseделает это, чтобы создать_metaатрибут на каждой модели Django, которая содержит машины проверки, детали поля, сохранение машин и так далее. И, во время этой операции, все, что указано во внутренней моделиMetaкласс считывается и используется в этом процессе.так что, пока да, в некотором смысле
Metaи метаклассы-это разные "вещи", в механике построения модели Django они тесно связаны; понимание того, как они работают вместе, углубит ваше понимание обоих сразу.это может быть полезным источником информации, чтобы лучше понять, как модели Django используют метаклассы.
https://code.djangoproject.com/wiki/DevModelCreation
и это тоже может помочь, если вы хотите лучше понять, как объекты работы в общем.
Comments