2011-03-20 8 views
7

모델 개체를 사전으로 변환하는 함수를 만들고 있습니다 (모든 사전에 foreignkeys을 재귀 적으로 포함). 나는 친구의 모델에서 obj._meta.fields을보고 필드를 얻을 수 있다고 배웠지 만 어디서나이 문서를 찾을 수 없습니다.개체의 필드를 가져 오는 방법은 무엇입니까?

모델 필드를 얻으려면 어떻게해야합니까? _meta 클래스에서 찾을 수있는 것을 어떻게 해석 할 수 있습니까?

답변

9

이것은 꽤 흥미로 보였습니다. 그래서 저는 django.forms 소스를 살펴보고 ModelForm 구현을 특별히 살펴 보았습니다. 나는 ModelForm이 주어진 인스턴스를 인트로 스페 팅하는 것에 상당히 능숙 할 것이라고 생각했다. 그리고 당신의 방법으로 당신을 도울 수있는 편리한 함수가 있다는 것을 알았다. 그 내부 구현 세부 사항 때문에

>>> from django.forms.models import model_to_dict 
>>> from django.contrib.auth.models import Group 
>>> g = Group.objects.filter()[0] 
>>> d = model_to_dict(g) 
>>> d 
{'permissions': [40, 41, 42, 46, 47, 48, 50, 43, 44, 45, 31, 32, 33, 34, 35, 36, 37, 38, 39], 'id': 1, 'name': u'Managers'} 
>>> 

이해할 상기 _meta 특성 문서화된다. 나는 언제든지 그것을 바꿀 수는 없으므로 사용하는 것이 상대적으로 안전 할 것이다. 위의 model_to_dict 함수를 사용하여 원하는 작업을 수행 할 수 있습니다. 많은 변화가 없어야합니다. 재귀 적으로 모델을 포함 할 계획이라면 역관계를 조심하십시오.

조사하려는 또 다른 방법이있을 수 있습니다. django-piston은 유용 할 수도있는 emitters 몇 가지를 선언하는 RESTful 프레임 워크, 특히 BaseEmitter.construct() 메소드입니다. RESTful 직렬화 이외의 용도로 사용하는 DictionaryEmitter을 쉽게 정의 할 수 있어야합니다.

+0

오, nice,'model_to_dict '기본적으로 내 기능이 무엇을하고 있었는지 (나는'objectToDict'라고 불렀다.) 편집해라. 아, 그건 내가하고 싶은 foreignekys를 따르지 않는다. 나는 그걸 불러서 그것의 모습을 볼 수 있다고 생각한다. 필드지만, 이미'_meta' 필드로 썼습니다. 그래서주기를 잡는 데 대한 팁을 주셔서 감사합니다. func로 처리했습니다. (이미 객체를 보았을 때 반복적으로 대신 결과를 사용합니다.) – Claudiu

+0

아니요, FK를 따르지 않지만 model_to_dict로 재귀 적으로 각 foreign_key_id를 대체 할 수 있습니다. 이미 작동 했으므로 걱정하지 않아도됩니다. 앞서 언급했듯이 model_to_dict는 시작 도구로 사용될 수 있지만, 그에 따라 적응된다. –

4

There's some docs on it 등이 있지만 대부분 내부적으로 사용되는 django 함수 (예 : _meta.fields 또는 _meta.get_all_field_names(), _meta.get_field_by_name)를 사용하는 경향이 있습니다.

나를 위해, 이것들은 iPython과 탭 완료를 통해 가장 잘 발견됩니다. 또는 출처.

+1

+1 -이 문서 (및 다른 개체 메서드 모음)는 매우 부족합니다. dir 함수는 이와 같은 것들에 관해서 가장 친한 친구 였으니 계속 사용하십시오. 나는 장고에서 코딩을 시작한 이래로 가장 좋은 학습 도구 중 하나임을 발견했다. – hellsgate

+1

yeah,'dir','help', 그리고 대화 형 cmd 라인의 trifecta는 내가 파이썬을 좋아하는 가장 큰 이유이다. – Claudiu

관련 문제