如何在常规的django视图中向tastype资源中添加数据



我遇到了一个问题,试图在常规django视图中包含较大的json响应中的tastype资源。我想让视图返回这样的东西(基于视图中生成的查询集,而不是来自典型的tastypie get参数):

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

其中objectlist是序列化的tasttype资源列表,成功、消息和错误来自视图中的其他地方。

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

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

这样做的全部目的是保持模型json表示的一致性,以尽量减少直接使用tastypie api和使用这些视图中返回的数据之间的摩擦。我认为解决方案是以某种方式在每个资源上使用full_dehydrate方法而不序列化它们,然后将它们添加到更大的字典中,然后序列化该字典,但我不确定该使用哪种序列化器。或者,也许有更好的方法。

通常情况下,写下来帮助我找到一个临时的解决方案。也许有人会有一些建议,如何使它更好。

我用它来准备一个序列化的查询集:

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

我使用了来自tastype . 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')

这似乎有效。也许你看到了这种方法的缺点,或者看到了改进它的方法?

最新更新