2010-05-18 5 views
1

몇 가지 장고 앱을 개발했습니다. 모두 모델과 상호 작용하는 측면에서 매우 간단합니다.장고는 가장 효율적인 방법입니까?

더 나은 용어가 없기 때문에 여러 가지 다른보기가있는 건물을 지금 만들고 있습니다. "canned"검색 결과 페이지입니다. 이러한 페이지는 모두 동일한 모델의 결과를 반환하지만 다른 열에서 필터링됩니다. 우리는 타입에 대해 필터링 할 수도 있고, 또 다른 하나는 타입과 크기에 대해 필터링 할 수도 있고, 또 다른 하나는 크기 만 필터링 할 수도 있습니다. ...

나는 함수를 views.py에 작성했습니다. 이 페이지의 각각에 의해 사용 된, 그것은 kwargs를 안으로 가지고 가고 검색 할 것이다 표준이다. 최소값은 하나의 필터이지만 뷰 중 하나는 최대 4를가집니다.

kwargs dict에 필터 유형 중 하나가 포함되어 있는지 간단히보고 있습니다. 그렇다면이 값에 대한 결과를 필터링합니다 (이제이 코드를 작성했습니다).) 나는 오류 경우 사과,하지만 당신은 요점을 파악해야합니다

def get_search_object(**kwargs): 

    q = Entry.objects.all() 

    if kwargs.__contains__('the_key1'): 
    q = q.filter(column1=kwargs['the_key1']) 

    if kwargs.__contains__('the_key2'): 
    q = q.filter(column2=kwargs['the_key2']) 

    return q.distinct() 

을 이제 장고 문서 (http://docs.djangoproject.com/en/dev/topics/db/queries/#id3)에 따라, 이러한 설정이 평가 될 때까지 DB 명중되지 않습니다 점에서, 괜찮습니다 요즘 나는 이것이 가장 효율적인 방법이 아니며 대신 Q 객체를 사용해야한다고 들었다.

다른 개발자의 답변을 찾고 있습니다. 내 방식은 현재 잘 작동합니다. 내 방식이 자원 POV에서 완전히 잘못된 경우, 최대한 빨리 변경됩니다.

미리 감사드립니다.

답변

2

이 경우 효율성 측면에서 보면 괜찮습니다. AND 대신 필터를 OR해야하는 경우 Q 객체 만 사용해야합니다.

+0

, 당신이 할 수 있습니다 : 당신은 그냥 유효한 필드가이 모델에 있다는 확인하는 애호가 솔루션을 원하는 경우

def get_search_object(**kwargs): valid_fields = ['the_key1', 'the_key2'] filter_dict = {} for key in kwargs: if key in valid_fields: filter_dict[key] = kwargs[key] entries = Entry.objects.filter(**filter_dict) return entries.distinct() 

, 당신은 (AB)는 _meta 사용할 수 있습니다 우수한 django-toolbar (http://github.com/robhudson/django-debug-toolbar)를 사용하는 것을 고려해보십시오. 방문하는 각 페이지를 만드는 데 필요한 SQL 쿼리를 분석합니다. 이 정보를 사용하여 다양한 쿼리 구현을 테스트하는 데 도움을 얻을 수 있습니다. "이론적으로는 이론과 실습간에 차이가 없다는 것을 기억하십시오. 그러나 실제로는 실제로 존재합니다." - 우연히도 그 인용문은 "SQL Performance Tuning" –

+0

책에서 나온 것입니다. 감사합니다. 감사합니다. – picus

3

Resource-wise는 괜찮습니다. 이중 밑줄 방법을 사용하지 않고 유지 관리하기 쉽도록 양식을 개선 할 수있는 많은 방법이 있습니다.

사용중인 kwargs이 실제 열 이름이면 kwargs을 해체하고 특정 키워드 만 수동으로 다시 작성하는 것이므로 매우 쉽게 단순화 할 수 있어야합니다.

def get_search_object(**kwargs): 
    entries = Entry.objects.filter(**kwargs) 
    return entries.distinct() 

주요 차이점은 키가 실제 열이고 꽤 예외적으로 예외 처리가 필요하다는 것입니다. 특정 필드 세트로 제한하려면 해당 목록을 지정한 다음 유효한 항목으로 사전을 작성하십시오. 보조 노트로

def get_search_object(**kwargs): 
    valid_fields = [field.name for field in Entry._meta.fields] 
    filter_dict = {} 
    for key in kwargs: 
     if key in valid_fields: 
      filter_dict[key] = kwargs[key] 
    entries = Entry.objects.filter(**filter_dict) 
    return entries.distinct() 
+0

흠, 흥미 롭습니다. 응답에 감사드립니다. – picus

관련 문제