3

我在尝试在常规 django 视图中的较大 json 响应中包含美味派资源时遇到了问题。我想让视图返回类似这样的内容(基于视图中生成的查询集,而不是来自典型的美味派获取参数):

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

其中对象列表是序列化的美味资源列表,成功、消息和错误来自视图中的其他位置。

现在,我无法弄清楚如何避免在构建更大的字典之前将序列化的资源转换为字符串,所以我目前有这样的东西:

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

这样做的重点是保持模型 json 表示的一致性,以尽量减少直接使用 sweetpie 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

我使用来自tastepie.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 回答