Django 모델이 주어지면 모든 필드를 나열하려고합니다. _meta 모델 속성을 사용하여이 작업을 수행하는 몇 가지 예를 보았지만 메타 앞의 밑줄이 _meta 속성이 개인 속성이고 직접 액세스해서는 안된다는 것을 나타내지 않습니까? … 예를 들어 _meta의 레이아웃이 향후 변경 될 수 있고 안정적인 API가 아니기 때문입니까?
_meta는이 규칙의 예외입니까? 안정적이고 사용할 준비가 되었습니까? 아니면 액세스하는 것이 나쁜 습관으로 간주됩니까? 아니면 _meta 속성을 사용하지 않고 모델의 필드를 검사하는 함수 나 다른 방법이 있습니까? 아래는 _meta 속성을 사용하여이를 수행하는 방법을 보여주는 일부 링크 목록입니다.
어떤 조언이라도 대단히 감사합니다.
답변
_meta
비공개이지만 비교적 안정적입니다. 이를 공식화하고 문서화하고 밑줄을 제거하려는 노력이 있습니다. 1.3 또는 1.4 이전에 발생할 수 있습니다. 어쨌든 많은 사람들이 사용하고 있기 때문에 이전 버전과의 호환성을 보장하기 위해 노력할 것이라고 생각합니다.
특히 호환성이 걱정된다면 모델을 가져와 필드를 반환하는 함수를 작성하세요. 즉, 미래에 무언가 변경 될 경우 하나의 기능 만 변경하면됩니다.
def get_model_fields(model):
return model._meta.fields
나는 이것이 Field
객체 목록을 반환한다고 믿습니다 . 인스턴스에서 각 필드의 값을 가져 오려면 getattr(instance, field.name)
.
업데이트 : Django 기여자들은 Google Summer of Code의 일부로 _Meta 객체를 대체하는 API를 개발하고 있습니다. 참조 : -https : //groups.google.com/forum/#!topic
/ django
– developers
/ hD4roZq0wyk – https : //code.djangoproject.com/wiki/new_meta_api
답변
이 게시물은 꽤 오래 알고 있지만 난 그냥이 할 수있는 공공 및 공식 API가 그 같은 일을 찾고있는 누군가에게 걱정 : get_fields()
및get_field()
용법:
fields = model._meta.get_fields()
my_field = model._meta.get_field('my_field')
https://docs.djangoproject.com/en/1.8/ref/models/meta/
답변
이제 특별한 메소드가 있습니다 -get_fields ()
>>> from django.contrib.auth.models import User
>>> User._meta.get_fields()
리턴되는 필드를 제어하는 데 사용할 수있는 두 개의 매개 변수를 허용합니다.
-
include_parents
기본적으로 True입니다. 부모 클래스에 정의 된 필드를 재귀 적으로 포함합니다. False로 설정하면 get_fields ()는 현재 모델에서 직접 선언 된 필드 만 검색합니다. 추상 모델 또는 프록시 클래스에서 직접 상속하는 모델의 필드는 부모가 아닌 로컬로 간주됩니다.
-
include_hidden
기본적으로 False입니다. True로 설정하면 get_fields ()는 다른 필드의 기능을 지원하는 데 사용되는 필드를 포함합니다. 여기에는 “+”로 시작하는 related_name (예 : ManyToManyField 또는 ForeignKey)이있는 모든 필드도 포함됩니다.
답변
get_fields()
를 반환 tuple
하고 각 요소는 Model field
유형이며 문자열로 직접 사용할 수 없습니다. 따라서 field.name
필드 이름을 반환합니다.
my_model_fields = [field.name for field in MyModel._meta.get_fields()]
위의 코드는 모든 필드의 이름을 conatining 목록을 반환합니다
예를
In [11]: from django.contrib.auth.models import User
In [12]: User._meta.get_fields()
Out[12]:
(<ManyToOneRel: admin.logentry>,
<django.db.models.fields.AutoField: id>,
<django.db.models.fields.CharField: password>,
<django.db.models.fields.DateTimeField: last_login>,
<django.db.models.fields.BooleanField: is_superuser>,
<django.db.models.fields.CharField: username>,
<django.db.models.fields.CharField: first_name>,
<django.db.models.fields.CharField: last_name>,
<django.db.models.fields.EmailField: email>,
<django.db.models.fields.BooleanField: is_staff>,
<django.db.models.fields.BooleanField: is_active>,
<django.db.models.fields.DateTimeField: date_joined>,
<django.db.models.fields.related.ManyToManyField: groups>,
<django.db.models.fields.related.ManyToManyField: user_permissions>)
In [13]: [field.name for field in User._meta.get_fields()]
Out[13]:
['logentry',
'id',
'password',
'last_login',
'is_superuser',
'username',
'first_name',
'last_name',
'email',
'is_staff',
'is_active',
'date_joined',
'groups',
'user_permissions']
답변
이것은 모델에서 폼을 만들 때 Django 자체가 수행하는 작업입니다. _meta 속성을 사용하고 있지만 Bernhard가 언급했듯이 _meta.fields와 _meta.many_to_many를 모두 사용합니다. django.forms.models.fields_for_model을 살펴보면 다음과 같이 할 수 있습니다.
opts = model._meta
for f in sorted(opts.fields + opts.many_to_many):
print '%s: %s' % (f.name, f)
답변
_meta에 포함 된 모델 필드는 각 필드 개체의 목록으로 여러 위치에 나열됩니다. 키가 필드 이름 인 사전으로 작업하는 것이 더 쉬울 수 있습니다.
제 생각에 이것은 모델 필드 객체를 수집하고 구성하는 가장 불필요하고 표현적인 방법입니다.
def get_model_fields(model):
fields = {}
options = model._meta
for field in sorted(options.concrete_fields + options.many_to_many + options.virtual_fields):
fields[field.name] = field
return fields
( django.forms.models.fields_for_model 의이 예제 사용법 을 참조하십시오 .)
답변
이건 어때.
fields = Model._meta.fields