3

通常のdjangoビューで、より大きなjson応答にtastypieリソースを含めようとして問題が発生しています。ビューが次のようなものを返すようにしたいと思います(典型的なtaspypie get paramsからではなく、ビューで生成されたクエリセットに基づいています):

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

ここで、objects list はシリアル化された Tastypie リソースのリストであり、成功、メッセージ、およびエラーはビューの別の場所から来ています。

現在、より大きな辞書が構築される前に、シリアル化されたリソースを文字列に変換することを回避する方法がわかりません。現在、次のようなものがあります。

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

これの要点は、モデルの json 表現の一貫性を保ち、tastypie API を直接使用することと、これらのビューで返されるデータを使用することの間の摩擦を最小限に抑えることです。解決策は、各リソースをシリアル化せずに full_dehydrate メソッドを使用し、それらをより大きな辞書に追加してから、その辞書をシリアル化することだと考えていますが、どのシリアライザーを使用するかわかりません。または、もっと良い方法があるかもしれません。

4

1 に答える 1

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')

これはうまくいくようです。この方法のどこか悪い点、または改善方法を見つけたのではないでしょうか?

于 2013-03-09T23:55:13.863 に答える