2011-03-27 2 views
2

에서 모델하지만 쇼 결과에 페이스 팅하는장고 건초 더미/SOLR : M : 내가 장고의 두 가지 모델이 좋아하는이 단지 외래 키 필드

class Medicine(db.Model): 
    field_1 = db.CharField() 
    field_2 = db.CharField() 

class Application(db.Model): 
    field_1 = db.CharField() 
    field_2 = db.CharField() 
    medicine = db.ForeignKey(Medicine) 

가 1이 (의사 코드) 다음과 같습니다. 한 약은 많은 응용 분야를 가질 수 있습니다.

Application 필드에서 패싯해야하지만 관련된 Medicine 개체 만 표시해야합니다. SQL에서 DISTINCT와 같은 것.

haystack으로이 작업을 수행하는 가장 직접적인 방법은 무엇입니까?

Medicine 또는 Application에 대해 SearchIndex을 만듭니 까? ApplicationSearchIndex을 입력하면 중복 된 Medicine 개체를 어떻게 검색합니까?

추신 : 솔라의 dev 릴리스에는 필드 축소 기능이 있습니다.하지만 거대한 데이터베이스와 성능이 중요하기 때문에 필자는이를 피하고자합니다.

답변

3

haystack 메일 링리스트에서 Daniel Lindsay (Haystack/pySolr 작성자)의 도움으로 문제를 해결했습니다.

from haystack import indexes 

class Medicine(indexes.SearchIndex): 
    field_1 = indexes.MultiValuedField(faceted=True) 
    # Other field definitions 


    def prepare_field_1(self, object): 
     values = list() 
     for app in object.applications.all(): 
      values.append(app.field_on_which_to_facet) 
     return values 

    # define "prepare_fieldname" methods for other fields in similar fashion. 

색인 생성되는 데이터가 거대하기 때문에 색인 생성에는 다소 시간이 걸리지 만 매력적으로 작동합니다.

+0

템플릿에 필드 값을 어떻게 표시 했습니까? MultiValueField가없는 경우 일반적으로 {{result.object.afiledname}}을 사용합니다. 그러나이 경우 어떻게 수행하는지 정확히 모르겠습니다. – avatar

+0

나는 당신의 질문을 완전히 이해하지 못합니다. 내가 한 것은 'Medicine_rendered.txt'라는 템플릿을 사용하는 'rendered = CharField (use_template = True, indexed = False)'로 정의 된 병합되지 않은 필드에 결과 스 니펫을 저장하는 것입니다. 이 템플릿에서 단일 결과 개체에 대한 html 코드 조각을 넣습니다. 그런 다음 템플릿에서 {{object_name.rendered}}를 렌더링하면됩니다. 자세한 내용은 http://django-haystack.readthedocs.org/en/latest/searchindex_api.html#stored-indexed-fields –

+0

'MultiValuedField' 대신'MultiValueField'를 참조하십시오. –

관련 문제