programing tip

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

itbloger 2020. 6. 2. 08:30
반응형

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


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

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

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

class FooMetaClass(type):
    ...

class FooClass:
    __metaclass__ = FooMetaClass

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


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

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

    이것은 일부 옵션 (메타 데이터)이 모델에 첨부 된 클래스 컨테이너입니다. 사용 가능한 권한, 관련 데이터베이스 테이블 이름, 모델이 추상적인지 여부, 단수형 및 복수형 이름 등을 정의합니다.

    짧은 설명은 여기 있습니다 : Django 문서 : 모델 : 메타 옵션

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

  2. 파이썬의 메타 클래스 :

    가장 좋은 설명은 다음과 같습니다. Python의 메타 클래스 란 무엇입니까?


위의 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 에서는 모델이 생성 될 때 모델이 생성 _metaOptions객체 인 속성 을 탐색하려고합니다 metaclass. 이곳에서 Django 클래스 '메타'정보를 모두 찾을 수 있습니다. 장고에서는 객체 Meta를 만드는 과정에 정보를 전달하는 데 사용됩니다 _meta Options.


Django의 Model클래스 Meta는 클래스 라는 속성을 갖는 것을 처리합니다 . 일반적인 파이썬이 아닙니다.

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


장고 모델 Meta과 메타 클래스가 "완전히 다르다" 고 주장하는 답은 오해의 소지가 있습니다.

The construction of Django model class objects (that is to say the object that stands for the class definition itself; yes, classes are also objects) are indeed controlled by a metaclass called ModelBase, you can see that code here:

https://github.com/django/django/blob/master/django/db/models/base.py#L61

And one of the things that ModelBase does is to create the _meta attribute on every Django model which contains validation machinery, field details, saving machinery and so forth. And, during this operation, anything 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

참고URL : https://stackoverflow.com/questions/10344197/how-does-djangos-meta-class-work

반응형