如何在django-tastypie自定义序列化器中访问请求对象?

时间:2014-10-02 07:43:15

标签: django tastypie

我有一个中间件,它根据请求修改请求对象

class MyMiddleware():
    def process_request(self, request):
        if request.path_info = "some special path":
            request.some_special_attribute = True
        return request

我有一个使用自定义序列化程序的资源

class MyResource(ModelResource):
    name = fields.CharField("name")
    class Meta:
        serializer = MySerializer()


class MySerializer(Serializer):
    def from_json(self, content):
        if request.some_special_attribute:
            # modify the object and return

并且序列化程序必须访问请求对象才能返回正确的响应对象

似乎没有办法做到这一点。

1 个答案:

答案 0 :(得分:1)

我认为你混淆了资源的工作和序列化工作的工作。您不应该尝试在序列化程序中实现任何业务逻辑;它仅用于在json(或其他)和本机python数据结构之间进行转换。

“并且序列化程序必须访问请求对象才能返回正确的响应对象”。 资源就是为了做到这一点。

我建议阅读有关保湿和脱水数据的文档。 http://django-tastypie.readthedocs.org/en/latest/resources.html#advanced-data-preparation

以下是来自文档的示例,他们根据请求中的属性更改了请求正文。

class MyResource(ModelResource):

    class Meta:
        queryset = User.objects.all()
        excludes = ['email', 'password', 'is_staff', 'is_superuser']

    def dehydrate(self, bundle):
        # If they're requesting their own record, add in their email address.
        if bundle.request.user.pk == bundle.obj.pk:
            # Note that there isn't an ``email`` field on the ``Resource``.
            # By this time, it doesn't matter, as the built data will no
            # longer be checked against the fields on the ``Resource``.
            bundle.data['email'] = bundle.obj.email
        return bundle