사람들이를 사용하여 클래스에 추가 매개 변수를 추가 할 수있게 해주는 Django를 사용하고 있습니다 class Meta
.
class FooModel(models.Model):
...
class Meta:
...
파이썬 문서에서 찾은 유일한 것은 :
class FooMetaClass(type):
...
class FooClass:
__metaclass__ = FooMetaClass
그러나 나는 이것이 같은 것이라고 생각하지 않습니다.
답변
두 가지 다른 점에 대해 질문하고 있습니다.
-
Meta
장고 모델의 내부 클래스 :이것은 일부 옵션 (메타 데이터)이 모델에 첨부 된 클래스 컨테이너입니다. 사용 가능한 권한, 관련 데이터베이스 테이블 이름, 모델이 추상적인지 여부, 단수형 및 복수형 이름 등을 정의합니다.
짧은 설명은 여기 있습니다 : Django 문서 : 모델 : 메타 옵션
사용 가능한 메타 옵션 목록은 다음과 같습니다. 장고 문서 : 모델 메타 옵션
Django의 최신 버전 : Django Docs : Model Meta 옵션
-
파이썬의 메타 클래스 :
가장 좋은 설명은 여기 있습니다 : 파이썬에서 메타 클래스 란 무엇입니까?
답변
위의 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': <django.utils.functional.__proxy__ at 0x26a6610>,
'verbose_name_plural': <django.utils.functional.__proxy__ at 0x26a6650>}
그러나 Django 에서는 모델이 생성 될 때 모델이 생성 _meta
한 Options
객체 인 속성 을 탐색하려고합니다 metaclass
. 이곳에서 Django 클래스 ‘메타’정보를 모두 찾을 수 있습니다. 장고에서는 객체 Meta
를 만드는 과정에 정보를 전달하는 데 사용됩니다 _meta
Options
.
답변
Django의 Model
클래스 Meta
는 클래스 라는 속성을 갖는 것을 처리합니다 . 일반적인 파이썬이 아닙니다.
파이썬 메타 클래스는 완전히 다릅니다.
답변
Django 모델 Meta
과 메타 클래스가 “완전히 다르다” 고 주장하는 답변 은 잘못된 답변입니다.
Django 모델 클래스 객체 (즉, 클래스 정의 자체를 나타내는 객체; 클래스도 객체입니다)의 구성은 실제로이라는 메타 클래스에 의해 제어됩니다. ModelBase
여기에서 코드를 볼 수 있습니다 :
https://github.com/django/django/blob/master/django/db/models/base.py#L61
그리고 그 중 하나는 유효성 검사 기계, 필드 세부 정보, 논리 저장 등을 포함하는 모든 장고 모델 ModelBase
에서 _meta
속성 을 만드는 것입니다 . 이 작업 중에 모델의 내부 Meta
클래스에 지정된 항목을 읽고 해당 프로세스 내에서 사용합니다.
그렇습니다. 그렇지만 어떤 의미 Meta
에서 메타 클래스는 다른 ‘사물’입니다. 장고 모델 구성의 역학 내에서 그들은 밀접한 관련이 있습니다. 그들이 어떻게 협력하는지 이해하면 한 번에 두 가지에 대한 통찰력이 깊어 질 것입니다.
이것은 Django 모델이 메타 클래스를 사용하는 방법을 더 잘 이해하는 데 유용한 정보 소스가 될 수 있습니다.
https://code.djangoproject.com/wiki/DevModelCreation
객체의 일반적인 작동 방식을 더 잘 이해하려면이 방법도 도움이 될 수 있습니다.
답변
내부 메타 클래스 문서이 장고 모델 메타 데이터 문서는 순서 옵션 (순서 지정), 데이터베이스 테이블 이름 (db_table) 또는 사람이 읽을 수있는 단수 및 복수 이름 (verbose_name 및 verbose_name_plural)과 같이 “필드가 아닌 모든 것”입니다. 필요하지 않으며 모델에 클래스 메타를 추가하는 것은 완전히 선택 사항입니다.
https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options
답변
장고에서는 구성 클래스의 역할을하며 구성 데이터를 한 곳에 보관합니다 !!