2012-11-30 5 views
4

주어진 모델의 쿼리 세트 내용을 표시하는 매우 일반적인보기/템플릿이 있습니다.
12 개 쿼리 세트가있는 12 개 장소에서 사용합니다. 이제는 건초 더미 검색을 거기에 통합하려고했지만 SearchQuerySet이 템플릿의 QuerySet과 일치하지 않기 때문에 할 수 없습니다. 나는 기본적으로 검색어 세트 어디에서 오는지 이제 알 수 있습니까 내 일반 템플리트와보기를 나누기Django haystack SearchQuerySet to QuerySet

{%for obj in qs%} 
    {{obj.object.foreign_key.name}} 
{%endfor%} 

을 할 필요가 일반 검색어 세트와

은 내가 SearchQuerySet으로

{%for obj in qs%} 
    {{obj.foreign_key.name }} 
{%endfor%} 

을한다.

나는 searchqueryset가 정상의 검색어처럼 작동하도록하는 방법을 싶습니다 나는 것을 알고 :

  • 내가 점수를 잃게됩니다 나는 순서
  • 을 mantain지라도 내가해야 할 것

내 템플릿을 일반으로 유지하면서 SearchQuerySet를 수락하거나 SearchQuerySet을 QuerySet으로 변환하는 방법에 대한 힌트가 있습니까?

+0

다음과 같은보기에서 목록을 반환하는 방법 : [obj.obj에 대한 객체], 그럼 템플릿의 forloop은 여전히 ​​작동해야합니다 – Charl

+0

그것은 전체 queryset을 인스턴스화하는 것입니다, 게다가 페이지 매김을 잃을 것이고 모두, 나는 queryset과 같은 객체를 반환 할 필요가 있습니다 – Sala

답변

0

당신은 할 수있는이 같은 배열 :

q = request.GET['q'] 
    results = SearchQuerySet().auto_query(q) 
    obj = [] 
    for r in results: 
     obj.append(r.object) 
    return render_to_response('template.html', 
     {'obj': obj) 
+2

만약 당신이 이것을한다면, d 권장하지 않는다면) 적어도 생성자 클래스에서이를 감싸 주어야한다. 생성기 클래스는 count()를 노출하고 반복되는 동안 객체를 반환한다. 그렇지 않으면 쿼리에 수천 개의 레코드가 포함되어 있으면 단일 요청으로 인해 서버가 종료 될 위험이 있습니다. – Cerin

2

무엇 당신의 검색어 세트가 SearchQuerySet처럼 행동 그래서, object를라는 모델 방법을 추가하는 방법에 대한? 예

class MyModel(models.Model): 
    ... 
    def object(self): 
     return self 
6

이 내가 그 당신의 모델 object 방법을 추가 방지 사용 깔끔한 발전기 트릭, 그리고 당신이 모두 장고의 QuerySet 및 건초 더미 SearchQuerySet에 대해 동일한 템플릿을 사용할 수 있습니다.

트릭은 SearchQuerySet을 생성기로 래핑하는 것입니다.

# In your view... 

def queryset_gen(search_qs): 
    for item in search_qs: 
     yield item.object # This is the line that gets the model instance out of the Search object 

qs = queryset_gen(sqs) 

이 방법의 장점은 SearchQuerySet 반환 및 만들거나 목록의 다른 인스턴스를 저장할 필요가 없습니다로 계산 및 메모리를 저장하는 순서를 유지하는 것입니다.

0

QS와 같은 SQS 치료에 대한보다 일반적인 접근법을 찾고있는 다른 사람들의 경우.

Django Rest Framework에는 다음과 같은 것이 필요 했으므로 sqs -> qs에 대해 다음 래퍼를 만들었습니다. SQS는 반복 및 슬라이싱에 대한 지원이 제한되어있는 쿼리 세트 인 것처럼 처리 할 수 ​​있습니다.

생성기 함수에서 반복하기 전에 load_all을 호출 할 수도 있습니다.

class SearchQuerySetWrapper(object): 
    """ 
    Decorates a SearchQuerySet object using a generator for efficient iteration 
    """ 
    def __init__(self, qs): 
     self.qs = qs 

    def count(self): 
     return self.qs.count() 

    def __iter__(self): 
     for result in self.qs: 
      yield result.object 

    def __getitem__(self, key): 
     if isinstance(key, int) and (key >= 0 or key < self.count()): 
      # return the object at the specified position 
      return self.qs[key].object 
     # Pass the slice/range on to the delegate 
     return SearchQuerySetWrapper(self.qs[key])