2012-11-21 2 views
2

Person 모델에 이름 필드와 성 필드가 있다고 가정합니다. 동일한 이름을 가진 많은 사람들이있을 것입니다. 고유 한 이름 목록을 얻을 수있는 TastyPie 리소스를 작성하고 싶습니다 (중복되지 않음).TastyPie로 고유 필드 필터링

장고 모델을 직접 사용하면 Person.objects.values("first_name").distinct()과 같은 것을 쉽게 말할 수 있습니다. TastyPie로 어떻게 똑같은 것을 얻을 수 있습니까?

+0

그래서 내가 질문에 답할 수는 없지만, ModelResource가이 경우에 필요한 것을 수행 할 수없는 것처럼 보였으므로, 방금'Resource'를 파생하여 사용자 정의 리소스를 만들었습니다. – keathmilligan

답변

2

업데이트

나는 distinct 전화를하기 전에 값을 사용하려면 아래 링크 apply_filters 방법을 채택했습니다. 대신에 모델 객체의

def apply_filters(self, request, applicable_filters): 
    qs = self.get_object_list(request).filter(**applicable_filters) 

    values = request.GET.get('values', '').split(',') 
    if values: 
     qs = qs.values(*values) 

    distinct = request.GET.get('distinct', False) == 'True' 
    if distinct: 
     qs = qs.distinct() 

    return qs 

values 반환 사전, 그래서 당신이 alter_list_data_to_serialize를 오버라이드 (override) 할 필요가 있다고 생각하지 않습니다.

apply_filters의 빛 재정과 관련된 문제 heredistinct 부분에 대한 좋은 해결책이 있습니다 원래 응답

.

어떤 필드가 반환되는지 필터링하는 매끄러운 방법이 없다는 것에 놀라지 만, alter_list_data_to_serialize을 무시하고 직렬화 직전에 원하지 않는 필드를 삭제하여 구현할 수 있습니다.

def alter_list_data_to_serialize(self, request, data): 
    data = super(PersonResource, self).alter_list_data_to_serialize(request, data) 
    fields = request.GET.get('fields', None) 
    if fields is not None: 
     fields = fields.split(',') 
     # Data might be a bundle here. If so, operate on data.objects instead. 
     data = [ 
      dict((k,v) for k,v in d.items() if k in fields) 
      for d in data 
     ] 
    return data 

다음 두 가지를 결합하여 /api/v1/person/?distinct=True&values=first_name과 같은 것을 사용하면 원하는 것을 얻을 수 있습니다. 이는 일반적으로 작동하며 추가 필터링 (&last_name=Jones)으로 계속 작동합니다.

+0

이 접근법은'distinct' 연산이 먼저 일어나기 때문에 중복 된 이름을 제거하지 않습니다. 그래서'Person' 객체는 구별되지 않는'first_names'가 아닙니다. – keathmilligan

관련 문제