我遇到了一个问题,试图在常规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')
这似乎有效。也许你看到了这种方法的缺点,或者看到了改进它的方法?