업데이트
나는 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
의 빛 재정과 관련된 문제 here의 distinct
부분에 대한 좋은 해결책이 있습니다 원래 응답
.
어떤 필드가 반환되는지 필터링하는 매끄러운 방법이 없다는 것에 놀라지 만, 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
)으로 계속 작동합니다.
그래서 내가 질문에 답할 수는 없지만, ModelResource가이 경우에 필요한 것을 수행 할 수없는 것처럼 보였으므로, 방금'Resource'를 파생하여 사용자 정의 리소스를 만들었습니다. – keathmilligan