개발/Python

Django의 Meta 클래스는 어떻게 작동합니까?

MinorMan 2021. 1. 8. 05:53
반응형

<질문>

사람들이 사용하여 클래스에 추가 매개 변수를 추가 할 수있는 Django를 사용하고 있습니다.class Meta.

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

내가 파이썬 문서에서 찾은 유일한 것은 :

class FooMetaClass(type):
    ...

class FooClass:
    __metaclass__ = FooMetaClass

그러나 나는 이것이 같은 것이라고 생각하지 않습니다.


<답변1>

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


<답변2>

위의 Tadeck의 Django 답변을 확장하면 Django에서 'class 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': ,
 'verbose_name_plural': }

그러나 Django에서는_meta인 속성Options모델에 의해 생성 된 객체metaclass모델이 생성 될 때. 여기에서 모든 Django 클래스 '메타'정보를 찾을 수 있습니다. 장고에서는Meta정보를 만드는 과정에 정보를 전달하는 데 사용됩니다._metaOptions목적.


<답변3>

장고Model클래스는 특별히Meta클래스입니다. 일반적인 파이썬이 아닙니다.

파이썬 메타 클래스는 완전히 다릅니다.


<답변4>

Django 모델을 주장하는 답변Meta메타 클래스는 "완전히 다릅니다"라는 잘못된 대답입니다.

Django 모델의 구성클래스 객체즉, 클래스 정의 자체를 나타내는 객체 (예, 클래스도 객체 임)는 실제로 다음과 같은 메타 클래스에 의해 제어됩니다.ModelBase, 그리고 당신은 할 수 있습니다see that code here.

그리고 그 중 하나는ModelBase하는 것입니다_meta유효성 검사 기계, 필드 세부 정보, 저장 논리 등을 포함하는 모든 Django 모델의 속성. 이 작업 중에 모델의 내부에 지정된 물건은Meta클래스는 해당 프로세스 내에서 읽고 사용됩니다.

그래서, 예, 어떤 의미에서Meta메타 클래스는 서로 다른 '사물'이며, Django 모델 구성의 메커니즘 내에서 밀접하게 관련되어 있습니다. 그들이 어떻게 함께 작동하는지 이해하면 두 가지 모두에 대한 통찰력이 한 번에 더 깊어 질 것입니다.

Django 모델이 메타 클래스를 사용하는 방법을 더 잘 이해하는 데 유용한 정보 소스가 될 수 있습니다.

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

객체가 일반적으로 작동하는 방식을 더 잘 이해하려는 경우에도 도움이 될 수 있습니다.

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


<답변5>

Django에서는 구성 클래스 역할을하며 구성 데이터를 한 곳에 보관합니다 !!


<답변6>

내부 메타 클래스 문서이 장고 모델 메타 데이터 문서는 순서 지정 옵션 (순서 지정), 데이터베이스 테이블 이름 (db_table) 또는 사람이 읽을 수있는 단 복수 이름 (verbose_name 및 verbose_name_plural)과 같은 "필드가 아닌 모든 것"입니다. 필수 사항은 없으며 모델에 Meta 클래스를 추가하는 것은 완전히 선택 사항입니다.https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options


<답변7>

수업메타코드 로직에서model.fields만나다당신과 함께form.widgets. 따라서 Class Meta () 아래에서 모델 필드와 양식에 포함하려는 다른 위젯 간의 링크를 만듭니다.

반응형