【问题标题】:How to modify Django Rest Framework incoming request?如何修改 Django Rest Framework 传入请求?
【发布时间】:2017-01-17 02:07:31
【问题描述】:

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

我的两个用例:

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

现在,我已经对某些 POST 参数执行了类似的操作。我现在这样做的方式是在我的通用ListCreateApiView 的post() 函数中,我将直接修改请求对象,然后使用该新请求对象调用self.create()。这是正确的方法,还是有更好的方法?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    您可以通过多种方式做到这一点。作为验证的一部分,或在请求序列化程序的 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
    

    【讨论】:

      【解决方案2】:

      查看此站点:http://www.cdrf.co 它是给定类上所有可用方法的易于导航的显示。您可以简单地使用它来覆盖您正在使用的视图。如果是模型 ViewSet,您可能需要 perform_create 和 perform_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'
                  )
      

      【讨论】:

        【解决方案3】:

        如果您使用 django-rest-framework,这些事情可以由 serializers 完成。 对于avatar,使用默认值URLField。 对于时间戳,您可能应该创建一个custom field。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-22
          • 2018-09-22
          • 2014-08-24
          • 1970-01-01
          • 2023-01-08
          相关资源
          最近更新 更多