programing

장고의 중첩된 메타 클래스는 어떻게 작동합니까?

firstcheck 2022. 10. 29. 14:42
반응형

장고의 중첩된 메타 클래스는 어떻게 작동합니까?

저는 Django를 사용하고 있습니다.이를 사용하여 클래스에 파라미터를 추가할 수 있습니다.class Meta.

class FooModel(models.Model):
    ...
    class Meta:
        ...

Python의 문서에서 발견한 것은 다음과 같습니다.

class FooMetaClass(type):
    ...

class FooClass:
    __metaclass__ = FooMetaClass

하지만, 나는 이것이 같은 것이라고 생각하지 않는다.

다음 두 가지 사항에 대해 질문하고 있습니다.

  1. Meta 장고 모델의 내부 클래스:

    모델에 일부 옵션(메타데이터)이 연결된 클래스 컨테이너일 뿐입니다.여기에는 사용 가능한 권한, 관련 데이터베이스 테이블 이름, 모델이 추상인지 여부, 이름의 단수 및 복수 버전 등이 정의됩니다.

    간단한 설명: Django 문서: 모델: 메타 옵션

    사용 가능한 메타 옵션 목록은 다음과 같습니다: Django 문서: 모델 메타 옵션

    최신 버전의 Django:Django 문서: 모델 메타 옵션

  2. Python의 메타클래스:

    최적의 설명은 다음과 같습니다.Python에서의 메타클래스는 무엇입니까?

위의 Tadek의 Django 답변을 확장하면, Django에서 '클래스 Meta:'를 사용하는 것도 일반적인 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>}

하지만, 장고에서 당신은 더 탐험하기를 원할 것이다._metaAtribute는 다음과 같습니다.Options모델에 의해 생성된 객체metaclass모델을 생성할 때 사용합니다.그곳에서 장고급 메타 정보를 찾을 수 있습니다.장고에서는Meta정보를 전달하기 위해서만 사용됩니다._meta Options물건.

장고의Modelclass는 특별히 이름이 붙은 Atribute를 가지고 있습니다.Meta그건 수업이야.일반적인 Python이 아닙니다.

Python 메타클래스는 완전히 다릅니다.

장고모델을 주장하는 답변Meta메타클라스는 전혀 다른 것으로 오해의 소지가 있습니다.

Django 모델 클래스 객체의 구성, 즉 클래스 정의 자체를 나타내는 객체(예, 클래스도 객체)는 실제로 메타클래스에 의해 제어됩니다.ModelBase코드는 여기 있습니다.

And one of the things that ModelBase does is to create the _meta attribute on every Django model which contains validation machinery, field details, save logic and so forth. During this operation, the stuff that is specified in the model's inner Meta class is read and used within that process.

So, while yes, in a sense Meta and metaclasses are different 'things', within the mechanics of Django model construction they are intimately related; understanding how they work together will deepen your insight into both at once.

This might be a helpful source of information to better understand how Django models employ metaclasses.

https://code.djangoproject.com/wiki/DevModelCreation

And this might help too if you want to better understand how objects work in general.

https://docs.python.org/3/reference/datamodel.html

Inner Meta Class Document:

This document of django Model metadata is “anything that’s not a field”, such as ordering options (ordering), database table name (db_table), or human-readable singular and plural names (verbose_name and verbose_name_plural). None are required, and adding class Meta to a model is completely optional. https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options

In Django, it acts as a configuration class and keeps the configuration data in one place!!

Class Meta is the place in your code logic where your model.fields MEET With your form.widgets. So under Class Meta() you create the link between your model' fields and the different widgets you want to have in your form.

ReferenceURL : https://stackoverflow.com/questions/10344197/how-does-djangos-nested-meta-class-work

반응형