2013-03-09 3 views
3

정규 django보기에서 더 큰 json 응답에 tastypie 리소스를 포함 시키려고 할 때 문제가 있습니다. 나는 (일반 tastypie가 PARAMS을 얻을에서, 뷰에서 생성 된 검색어 세트 기준)과 같이보기 반환 뭔가를하고 싶은 :일반 django보기에서 tastypie 리소스에 데이터를 추가하는 방법

개체 목록
{ 
    "success": bool, 
    "message": string, 
    "error": string, 
    "objects": [ 
     { 
      "field_one": bar, 
      "field_two": foo 
     } 
     ... more objects ... 
    ] 
} 

직렬화 tastypie 자원과 성공의 목록입니다, 메시지 및 오류가보기의 다른 곳에서 발생합니다. 지금

, 나는 큰 DICT 구축지기 전에 문자열로 직렬화 된 자원을 튜링 방지하는 방법을 알아낼 수 없습니다, 그래서 현재이 같은있다 :

{ 
    "success": bool, 
    "message": string, 
    "error": string, 
    "objects": [ 
     "{"field_one": bar, "field_two": foo..."}", 
     "{"field_one": baz, "field_two": foobar..."}", 
     ... 
    ] 
} 

이의 요점입니다 모델 json 표현을 일관성있게 유지하고, tastypie API를 직접 사용하는 것과 마찰을 최소화하고, 이러한 뷰에서 반환 된 데이터를 사용합니다. 솔루션을 어떻게 든 serialize하지 않고 각 리소스에 대해 full_dehydrate 메서드를 사용하고 더 큰 dict에 추가 한 다음 해당 dict을 serialize하는 것이라고 생각하지만 사용하려는 serializer가 확실하지 않습니다. 아니면 더 좋은 방법이 있을지도 모릅니다.

답변

1

종종이 경우를 작성하면 임시 해결 방법을 찾는데 도움이됩니다. 어쩌면 누군가가 이것을 더 잘하는 방법에 대한 의견을 갖게 될 것입니다. 내가 직렬화에 대한 검색어 세트를 준비하려면이 옵션을 사용하고

는 :

def serialize_queryset(resource_class, queryset): 
    # hand me a queryset, i give you dehydrated resources 
    resource = resource_class() 
    dd = {} 

    # make meta 
    dd['meta'] = {} 
    dd['meta']['limit'] = 1000 
    dd['meta']['next'] = None 
    dd['meta']['offset'] = 0 
    dd['meta']['previous'] = None 
    dd['meta']['total_count'] = len(queryset) 

    # objects 
    dd['objects'] = [] 
    for obj in queryset: 
     bundle = resource.build_bundle(obj=obj) 
     dehydrated_obj = resource.full_dehydrate(bundle) 
     dd['objects'].append(dehydrated_obj) 

    # return dict 
    return dd 

그리고 tastypie.serializer에서 시리얼을 사용합니다. 샘플보기에서 사용하면 다음과 같이 표시됩니다.

from tastypie.serializer import Serializer 

serializer = Serializer() 

def my_view(request): 

    #... do some other view stuff ... 

    # prepare a queryset for serialization 
    queryset = MyModel.objects.filter(is_cool=True) 
    data = serialize_queryset(MyModel, queryset) 

    # add in custom stuff, determined earlier in the view somewhere 
    data['success'] = success 
    data['message'] = message 
    data['error'] = error 

    # serialize and return response 
    data = serializer.serialize(data) 
    return HttpResponse(data, mimetype='application/json') 

이것은 작동하는 것 같습니다. 어쩌면이 방법이나 그 방법을 개선하는 방법에 대해 나쁘게 생각할 수도 있습니다.

+0

감사합니다. 그것은 정말로 도움이되었지만 요청과 관련이있는 메서드 메소드를 일부 dehydrate했기 때문에 직렬화 메서드 내에서 요청 obj를 전달하는 것이 더 낫다는 것을 언급해야합니다. 제 경우에는 request.user와 관련이 있습니다. – Azd325

관련 문제