【问题标题】: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'
)