我在尝试将 tastypie 资源包含在常规 django View 中的较大 json 响应中时遇到问题。我想让 View 返回类似这样的内容(基于 View 中生成的查询集,而不是来自典型的 tastypie get 参数):
{
"success": bool,
"message": string,
"error": string,
"objects": [
{
"field_one": bar,
"field_two": foo
}
... more objects ...
]
}
其中对象列表是序列化的 tastypie 资源列表,成功、消息和错误来自 View 中的其他地方。
现在,我不知道如何避免在构建更大的字典之前将序列化资源转换为字符串,所以我目前有这样的东西:
{
"success": bool,
"message": string,
"error": string,
"objects": [
"{"field_one": bar, "field_two": foo..."}",
"{"field_one": baz, "field_two": foobar..."}",
...
]
}
这样做的重点是保持模型 json 表示的一致性,以尽量减少直接使用 tastypie api 和使用这些 View 中返回的数据之间的摩擦。我在想解决方案是以某种方式在每个资源上使用 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
我使用来自 tastypie.serializer 的 Serializer。在示例 View 中使用它是这样的:
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')
这似乎有效。也许您发现了这种方法的缺点,或者有改进的方法?
关于python - 如何在常规 django View 中将数据添加到 tastypie 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15316939/