2011-08-31 10 views
1

약간의 배경 : 나는 반자동 사용자 (마케팅 담당자)가 분석 데이터에 깊이 액세스 할 수 있도록 강력한 동적 쿼리 세트 형식을 구축하려고합니다. QS 필드 조회 키가 주어지면 조인간에 필드 유형을 찾는 방법은 무엇입니까?

class Profile(models.Model): 
    user = models.OneToOneField("auth.User") 
    age = models.PositiveIntegerField() 

내가 반환하는 재귀 함수가 있습니다 :

나는 이미 모델처럼 주어진 예를 들어, 필드 검색 키를 제공하는 기능을 내장 한 내가 '무엇

[ 
    'id', 
    'user', 
    'user__id', 
    'user__username', 
    'user__first_name', 
    #...snip... 
    'user__is_active', 
    'user__date_joined', 
    #...snip... 
    'user__groups__permissions', 
    'user__groups__permissions__id', 
    'user__groups__permissions__name', 
    #...snip... 
    'age', 
] 

사용자가 선택한 키를 선택한 후에 & 디스플레이가 ModelForm의 기능과 비슷한 적절한 표준 양식 필드 (위젯)를 해석하지만 먼저 해당 필드의 유형이 필요합니다.

그래서 어떻게 'user__date_joined', '연령'과 같은 기능 한테 먹이와 'USER_ 그룹 _permissions__name'에 대해 가서 PositiveIntegerField,하여 DateField 및 CharField 다시 얻을 것 (각각을?).

Django가 ORM에서이 작업을 수행한다고 가정하므로 장고로 구워진 어딘가에서으로 구운 것 같습니다. 찾지 못했습니다.

답변

2

당신이 원하는 정보는 클래스의 메타 속성에 있습니다

Profile._meta.get_field_by_name('field_name') 

이 반환

(field_object, model, direct, m2m) 

model 당신은 모델 객체에서이있어 경우에 가득보다는 직접에서 클래스 객체 인 direct은 (ORM의 검색 결과로 생성되는 것이 아니라) 모델에 필드가 존재하면 true이고,이 필드가 many-to-many 관계의 일부인 경우 m2m이됩니다.

장고 소스 코드 (dB/모델/SQL/query.py)에서

[ '__'관계를 EDIT 같이, 이들은 다음 코드 필드 유형을 분해. 나는 그것을 말할 수는 없지만, 의미 론적으로 올바른 같습니다

parts = field_name.split('__') 
cur_model = model 
for name in parts: 
    (field, _, _, _) = cur_model._meta.get_field_by_name(name) 
    cur_model = field.rel.to 

이 기본적으로 외래 키 관계에 대한 필드는 ID를 포함하고 rel.to 장고 실제로 모델을 얻기 위해 사용하는 것입니다 말합니다 그 필드가 참조하고이 루프는 문자열에서 마지막으로 발견 될 때까지 필드 목록을 통해 내려갑니다.

+0

이것은 모델에 직접있는 모든 필드에서 작동하지만 '__'과 같은 구분 기호를 사용하면 실패합니다. – Bryan

+0

@Bryan : Django의 내부 코드에서 파생 된 루프를 사용하여 간단한 예제를 추가했습니다.이 예제에서는 ForeignKey 관계에 대해이 작업을 수행하는 방법을 보여줍니다. –

+0

감사합니다. 나는 그것이 도움이 될지 시험해 볼 것입니다. – Bryan

관련 문제