Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django DRF:将附加信息注入request.data的通用方法_Django_Django Rest Framework_Django Rest Viewsets - Fatal编程技术网

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()
    )之前,是否有一种编辑
    请求的通用方法

  • 如果不是1。);有不同的可能性吗


  • 提前感谢。

    如果您不想每次重写整个视图,可以使用序列化程序的
    .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