2013-01-15 2 views
3

현재 Django를 Django-Rest-Framework와 함께 사용하고 프론트 엔드에서 Ember.js/Ember-data를 사용하는 프로젝트를 작성 중입니다.Django 필드 쿼리 처리

내가 매개 변수가 조회되는 모델의 필드이고, X는 검색 할 값이 형식

http://myurl.com/application/api/model/?parameter=X 

내 장고 API에 대한 나의 엠버 응용 프로그램에서 쿼리를 전달하는 찾고 있어요. 느슨하게 이런

뭔가 결과 쿼리를해야

queryset = Model.objects.filter(**request.QUERY_PARAMS.dict()) 
QUERY_PARAMS.dict은() ** 키워드로 DICT를 변환하는 형식의 사전

{parameter:X} 

을 제공 장고 구문입니다

인수는 Django가 예상합니다. 나는 사용자 정의보기 및 사용자 정의 믹스 인을 사용하여 이미이 작업을

queryset = Model.objects.filter(parameter=X) 

하지만 구현을 처리하는 내 쿼리가 조금 순진 수 있다는 걱정 이것은 매우 일반적인 나를 친다 :
따라서 위의 라인은 효과적으로이다 무늬.

Django 또는 일부 Django 내부 용 라이브러리가 있는지 궁금합니다. 내 사용자 지정 쿼리 세트 코드없이 이러한 비교적 일반적인 쿼리를 처리 할 수 ​​있을지 완전히 이해하지 못하고 있습니까?

올바른 방향의 모든 포인터는 진심으로 감사 할 것입니다.

스티브 케인

편집 :

이 정수 querys을 처리하는 내 사용자 정의보기에서 내 기본 방법 촬영
def get_integer_queryset(self, query, queryset): 
    #stringify the first entry in query.keys (query is request.QUERY_PARAMS) 
    query_key = str(query.keys()[0]) 
    #split the string into individual strings since the request object dict 
    #contains only a string of numbers and not an actual array (see below) 
    #query = {'parameter':'1,2,3,4'} becomes {'parameter':['1','2','3','4']} 
    query_values = query.get(query_key, None).split(",") 
    #construct two dicts. One handles integers and the other handles "null" 
    #all the code below is required because Django does not seem to handle "null" 
    #as a valid query to a field that is type "integer" 
    #as a side note, I think this is poor and create annoying work...i would love 
    #to be wrong here 
    #the Q objects are required in order to compose a query of both integers and 
    #the string "null" 
    query_vals_no_null = {query_key+"__in": []} 
    optional_null_dict = {} 
    for value in query_values: 
     if value == "null" or value == "None": 
     optional_null_dict[query_key+"__isnull"] = True 
     else: 
     query_vals_no_null[query_key+"__in"].append(value) 
    return queryset.filter( Q(**query_vals_no_null) | 
          Q(**optional_null_dict) ) 

. 나는 무슨 일이 일어나고 있는지 명확히하기 위해 주석을 달았다. 이것이 도움이되는지 또는 익숙한/끔찍한/굉장한/다소 가벼운 것처럼 보이는지 알려주십시오.

스티브

+0

이것은 django의 이전 admin 파일 시스템과 비슷합니다. 최근에는 특정 매개 변수 만 쿼리 할 수 ​​있도록 검증을 추가했습니다. 관심이 있거나 관심이 없을 수도 있습니다 (단순히 입력과 VALID_PARAM_KEYS 목록 비교). –

+1

Steve the django-rest-framework 커뮤니티는 stackoverflow (좋든 나쁘 든)보다는 google 그룹에 사는 것처럼 보입니다. 난 당신이 위에서 언급 한 것처럼 사용자 지정 쿼리 로직을 아직 할 수 없지만 django-rest-framework에 대한 v1.0 ember-data 어댑터를 완료 했으므로 견고한 백엔드 응답을 얻은 후 후속 작업을하고 싶습니다. 해야만하는 것처럼 보입니다. https://groups.google.com/forum/?fromgroups#!forum/django-rest-framework –

+0

조회 처리 방법을 보여주기 위해 내보기에서 메소드 스 니펫을 추가했습니다. 이 메서드는 "정수"형식의 필드에 대한 쿼리에만 적용됩니다. 관련 필드에 대한 작업은 관련 필드의 참조가 정수 (일반적으로 PK 임) 인 경우에만 수행됩니다. – stevekane

답변

2

django-filter (및 REST 프레임 워크의 해당 장고 필터는 filter backend 기반) 정말 당신이 찾고있는 가장 가까운 아웃 - 오브 - 박스 응용 프로그램이지만, 당신이 발견 한대로 '아무튼

  • 그것은 쿼리 문자열에 null/None 키를 지원하지 않습니다 t은 매우 특히 때문에, 당신이 필요로하는 사용 사례를 지원합니다.
  • 쉼표로 구분하여 __in 스타일 조회를 지원하지 않습니다.

(I 위의 하나/모두 잘못 될 수 있지만, 그/문서는 소스 주변의 모양에서 나에게 표시 방법)을 의미

옵션은 아마도 :

  1. 필요한 방식으로 정확히 동작하도록 필터링을 작성하십시오.
  2. 위의 두 가지 문제에 대한 지원을 django-filter에 제공합니다.
  3. alternative filtering app을 찾아 필요한보기에서 더 쉽게 사용할 수 있도록 REST 프레임 워크 필터 백엔드에 배치 할 수 있습니다.

나는의 옵션을 생각하지 않는다 (3) tastypie와 피스톤에 신속하게 발굴을 갖고 싶어하고, 그들이 필터링 구현을 제공하는 경우가 표시 될 수 있지만 당신이 필요 꽤 무엇을 할 것 인 당신이 필요하다면, 그것들의 기초가됩니다.

alternate filter solution for REST framework에 대한 폐쇄 요청이 있습니다. 이는 __in 스타일 필터링을 지원하는 것처럼 보입니다. 그게 당신이 필요로하는 것 같다면 티켓에 대해 논평 할 가치가 있습니다. REST 프레임 워크에 다른 필터 백엔드를 제공하기 위해 다시 열어 볼 수 있습니다. (제 3 자 필터 백엔드로 이상적입니다.)

이미 시작한 것처럼 독자적인 필터 솔루션을 계속 사용하고보다 포괄적 인 것으로 끝내면 REST framework group에 언급 할 가치가 있습니다. 다른 사람들도이 기능을 사용할 수 있으므로 재사용이 쉬운 타사 패키지로 통합 할 가치가 있는지 고려해 볼 수 있습니다.

업데이트와 함께이 질문을 편집하여 그룹에서 어떻게하면되는지 알 수 있습니다.

+0

좋은 답변입니다. 내가 장고 필터를 제안하려고했지만 그 한계를 인식하지 못했습니다. 앱은 실제로 몇 가지면에서 부족하고 많은 작업이 필요합니다 (그리고이를 이끌어 갈 사람이 너무 많습니다 - 많은 포크가 있습니다). 내가 장고 필터 꽤 직장에서 사용하고, 거기에 비슷한 기능을 필요로 훨씬 더 많은 사람들이 놀랍군요. –

+0

@josh - 요즘 Florian Apolloner는 선두 주자입니다. 그는 스크래치가 발생하는 한 풀 요청에 매우 민감합니다. 일을 할 사람이 필요합니다. ;) 오랫동안 쟁점이되어 왔던 프로젝트라면 최근에 좀 더 많은 활동을 보았습니다. –

+0

답변에 github repo에 대한 링크를 넣을 수 있습니까? 나는 주요 프로젝트 (그냥 알렉스의 초기 레포)를 찾을 수없는 것 같습니다. –