2009-07-03 1 views
1

나는 장고 CONTENT_TYPES에 대한 질문 http://www.djangoproject.com/documentation/models/generic_relations/에 일반적인 콘텐츠 유형에 대한 검색어 세트를 필터링의 예에서장고 쿼리 일반 CONTENT_TYPES는

이 다음 줄이 있습니다.

ctype = ContentType.objects.get_for_model(quartz) 
TaggedItem.objects.filter(content_type__pk=ctype.id, object_id=quartz.id) 

누구나 content_type__pk의 의미를 설명 할 수 있습니까?

__은 간접 지정이 진행되고 있음을 의미합니까? 필터에서 일치하는 항목의 왼쪽에 어떤 의미가 있습니까? 그래서 content_type__pk 실제로 content_type_id로 변환 즉 ...

나는 데이터베이스로 번역 할 때 모델 정의

content_type = models.ForeignKey(ContentType) 

만에 콘텐츠 _라는 더 필드가없는 것을 볼 수 있지만, content_type_id이있다? 그렇다면 왜 필터 예제에서 이것을 사용하지 않았습니까?

답변

2

는 아니, 콘텐츠 _라고 타입의 ContentType의 필드를 가지고 TaggedItem 모델입니다.

각 모델에는 primary key이 있으며 여기에 "pk"라고 표시되어 있습니다. 대부분의 경우 "id"필드입니다. 그러나 sometimes it is not.

일관성을 유지하기 위해 id 필드를 pk로 참조 할 수 있습니다. 당신이 필터를 말 할 때 그래서 (content_type__pk = ...는 이중 밑줄 (__) 해당 모델의 필드에 대한 참조를 의미

... 필터 (content_type__id 비슷합니다. 당신은 스태킹 유지할 수 있습니다 이 :. 당신이 차례로 필드가 이름 명명했다 SuperCategory에 외래 키를 한 카테고리에 외래 키와 모델 자동차가 있다면

Car.objects.filter(category__supercategory__name = "Nice Cars") 

내가 틀렸다면 누구든지 나를 바로 잡습니다.

+0

예, 물론입니다. 어떻게 든 그것이 content_type 이었기 때문에 나는 그것이 평소보다 복잡하다고 상상하기 시작했다. 감사. – interstar

0

Django의 이중 밑줄 조회 표기법을 이해하지 못하면 일반적으로 일반 관계를 조사하기 전에 쿼리를 읽어야합니다. 이것은 기본이며 모든 장고 질의의 근본입니다. 걷기 전에 달리려하지 마십시오.

관계를 통한 조회에 대해서는 documentation으로 시작하십시오.

+1

제네릭을 마지막 수단으로 고려해야하기 때문에이 답변에 동의합니다. 일반적으로 당신은 그들을 필요로하지 않으며, 당신이 언제 알 수 있습니다. 제네릭을 사용하여 수행 한 작업 중 일부는 일반 모델을 사용하여 구현할 수 있었으며 추후에 더 나은 솔루션이었을 것입니다. – drozzy

+0

사실, 나는 그들이 필요한 것을 잘 알고있다. 나는 장고의 멍청한 녀석이지, 개발 한 사람이 아니다 .-) – interstar

+0

글쎄, 좋아. 포스가 함께하길! – drozzy