python - 如何在常规 django View 中将数据添加到 tastypie 资源

标签 python django json rest tastypie

我在尝试将 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/

相关文章:

python - celery 记录器配置

Python:为什么我不能将 map 对象转换为列表

json - 在 JSON 中建模标识符(唯一 ID)的最佳方法

python - CategoricalDType 列上的 Pandas 交叉表会抛出 TypeError

python - Pandas groupby value_count 按频率过滤

python - 使用 HttpResponse 为函数编写 Django 单元测试

Django i18n blocktrans vs trans

python:比较列表中的字符串

javascript - 从 json 数组中删除一些数据

php - 通过 JSON、JQuery、PHP 传递特定信息