如何修改Django Rest Framework传入请求?

时间:2016-09-09 02:17:00

标签: django django-models django-views django-rest-framework

我正在使用Django构建一个Web应用程序,它几乎只用作API服务器。我有一个连接到它的单页应用程序以及一个Android客户端。我需要修改一些传入的POST请求。

我的两个用例:

  • 如果在注册过程中用户没有选择要上传的头像图像(这是一个简单的TextField,即图像的URL),我应该可以插入默认的头像URL。像if request.data["avatar"] is None: <use default>
  • 这样的东西
  • 收到的&#34;时间戳&#34;来自Android客户端的请求都是unix时间戳。我希望将其转换为Django的日期时间 - 因此,当前请求带有date_time = 1473387225,我想将其转换为DateTime对象。

现在,我已经为某些POST参数做了类似的事情。我现在的方式是在我的通用post()的{​​{1}}函数中我将直接修改请求对象,然后使用该新请求对象调用ListCreateApiView。这是正确的方法,还是有更好的方法来做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:0)

如果您使用的是django-rest-framework,可以通过serializers完成这些操作。 对于avatar,请使用带有默认值的URLField。 对于时间戳,您应该创建一个custom field

答案 1 :(得分:0)

查看此网站:http://www.cdrf.co这是一个易于浏览的显示,可以显示给定班级上的所有可用方法。您只需使用此选项覆盖您正在使用的视图即可。如果是模型ViewSet,您可能需要perform_createperform_update

我经常做这样的事情:

class SomeViewSet(viewsets.ModelViewSet):
    queryset = SomeModel.objects.all()
    serializer_class = SomeModelSerializer

    def perform_create(self, serializer):
        data = self.request.data

        # make some changes to self.request here

        serializer.save(
                #change some things here
                field='some new value'
            )

答案 2 :(得分:0)

您可以通过多种方式执行此操作。作为验证的一部分,或在请求序列化程序的to_internal_value中或在自定义字段序列化程序中。

这里有一个作为自定义字段序列化程序一部分的示例。

class AccountCreationSerializer(serializers.Serializer):
    avatar = AvatarField(
        required=False
        allow_files=True
    )

# Custom Field Serializer
class AvatarField(serializers.FilePathField):
    def to_internal_value(self, value):
        user_defined_path = super(AvatarField, self).to_internal_value(value)
        if user_defined_path:
            return user_defined_path

        return default_path