Django DRF:将附加信息注入request.data的通用方法
在这种情况下,我有一个端点Django DRF:将附加信息注入request.data的通用方法,django,django-rest-framework,django-rest-viewsets,Django,Django Rest Framework,Django Rest Viewsets,在这种情况下,我有一个端点samples,它通过ModelViewSet表示模型sample 我的目标是,当一个用户使用数据发布此端点时 像 我希望能够在create方法中覆盖/添加key:value对到存储在request.data中的传入有效负载 这不能通过简单地访问request.data来实现,因为它是一个不可变的QueryDict 此外,我无法在perform\u create()方法中实现这一点,因为我可能注入的数据是验证关键的 目前,我一直使用以下解决方案,这要求我重写完整的cre
samples
,它通过ModelViewSet
表示模型sample
我的目标是,当一个用户使用数据发布此端点时
像
我希望能够在create
方法中覆盖/添加key:value对到存储在request.data
中的传入有效负载
这不能通过简单地访问request.data
来实现,因为它是一个不可变的QueryDict
此外,我无法在perform\u create()
方法中实现这一点,因为我可能注入的数据是验证关键的
目前,我一直使用以下解决方案,这要求我重写完整的create()
方法:
class MyViewSet(viewsets.ModelViewSet):
queryset = Sample.objects.all()
serializer_class = MSampleSerializer
name = "samples"
def add_info(self, request):
...
<acquire_info>
...
data = request.data.dict()
data["s"] = <info1>
data["r"] = <info1>
data["t"] = <info1>
return data
def create(self, request, *args, **kwargs):
data = self.add_info(request)
serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(
serializer.data, status=status.HTTP_201_CREATED, headers=headers
)
类MyViewSet(ViewSet.ModelViewSet):
queryset=Sample.objects.all()
serializer_class=MSampleSerializer
name=“样本”
def添加信息(自我、请求):
...
...
data=request.data.dict()
数据[“s”]=
数据[“r”]=
数据[“t”]=
返回数据
def创建(self、request、*args、**kwargs):
数据=自身。添加信息(请求)
serializer=self.get\u序列化程序(data=data)
serializer.is\u有效(raise\u exception=True)
self.perform\u创建(序列化程序)
headers=self.get\u success\u头(serializer.data)
返回响应(
serializer.data,status=status.HTTP_201_已创建,headers=headers
)
create()
或put()
)之前,是否有一种编辑请求的通用方法
提前感谢。如果您不想每次重写整个视图,可以使用序列化程序的
.to_representation()
或.to_internal_value()
方法
由于您也想验证数据,.to_representation()
可能是一种方法
从文档中:
如果需要更改序列化程序类的序列化或反序列化行为,可以通过重写.to_representation()
或.to_internal_value()
方法来实现
.to_表示(self,obj)
获取需要序列化的对象实例,并应返回原语表示。通常这意味着返回内置Python数据类型的结构。可以处理的确切类型取决于为API配置的渲染类
例如:
def to_representation(self, instance):
"""Convert `username` to lowercase."""
ret = super().to_representation(instance)
ret['username'] = ret['username'].lower()
return ret
请参见在django中间件中执行此操作不是更好吗?我尝试了您的建议,但似乎我无法访问
中的请求对象以访问\u internal\u value()
,在这种情况下,我需要执行此操作。您是否需要请求对象来访问请求.数据
?我认为您可以在实例
或ret
(来自示例)中获得它们。请原谅,我的回答有点仓促。我只是将代码从Viewset复制粘贴到序列化程序中。request
对象存储在执行该技巧的序列化程序中的self.context[“request”]
中。对于您的评论:不,我不需要acces数据
或实例
的请求对象,但对于“我在原始问题中没有指定的部分”。
def to_representation(self, instance):
"""Convert `username` to lowercase."""
ret = super().to_representation(instance)
ret['username'] = ret['username'].lower()
return ret