data._mutable= Django rest 框架中的 True

data._mutable= True in Django rest framework

提问人:Reactoo 提问时间:5/13/2022 更新时间:5/13/2022 访问量:863

问:

我已经看过很多次了,到处都看过,但无法弄清楚它的实际含义,它是强制性的吗?我以前没有在我的代码中使用过它,我不确定我是否应该使用它。data._mutable = True or False

代码片段看起来有点像这样。

def update(self, request, *args, **kwargs):
        instance = self.get_object()
        data = request.data
        if data.get("something") == "null":
            data._mutable = True
            data["something"] = None
            data._mutable = False

为什么我们需要将 True 或 False 分配给数据对象的私有属性_mutable。??

姜戈 应用程序接口 django-rest-框架 不变性 可变

评论

1赞 willeM_ Van Onsem 5/13/2022
否则,默认情况下不能设置 : 是不可变的,因此不接受更改数据。data['something'] = Nonerequest.data
0赞 Andrew 5/13/2022
这回答了你的问题吗?Django - 为什么是请求。POST 对象不可变?
0赞 Andrew 5/13/2022
这也主要是意见问题。在极少数情况下,您永远不需要使用它,所以请忽略它。将数据传递到序列化程序并对其进行验证,并在序列化程序中对其进行更改。

答:

1赞 willeM_ Van Onsem 5/13/2022 #1

如果使用 FormParser [drf-doc]MultiPartParser [drf-doc] 或其他解析为 QueryDict [Django-doc] 的解析器作为解析器,则默认情况下是不可变的。这意味着它将拒绝对其进行任何更改,因此您无法添加、删除或编辑键值对。QueryDict

通过设置该属性,可以防止引发错误,从而改变 .但这不是好的做法,因为没有记录可以通过将属性设置为 来使可变。通常你使用 .copy() [Django-doc],它将返回一个可变的深层副本,所以:._mutableQueryDictQueryDict._mutableTrue

def update(self, request, *args, **kwargs):
        instance = self.get_object()
        data = request.data
        if data.get('something') == 'null':
            data = data.copy()
            data['something'] = None
        # …

评论

0赞 Reactoo 5/13/2022
将 null 作为值或 None 不是一回事吗?我没有看到任何需要将 null 转换为 None 的情况。
1赞 willeM_ Van Onsem 5/13/2022
@Reactoo:这取决于数据的处理程序。在某些情况下,可能需要将其转换为 ,尽管对于有效的序列化程序来说,情况可能并非如此。nullNone
0赞 Reactoo 6/5/2022
@Williem,你能帮我吗?stackoverflow.com/questions/69770813/......