dvt*_*tan 6 python dictionary django-rest-framework
我试图添加一个键serializer.data['test'] = 'asdf',这似乎没有做任何事情.
我想转换键值的表示.为此,我尝试使用该值来计算新值并替换字典中的旧值.
这是我想要完成的,但我不知道为什么价值没有被替换.没有抛出错误,结果字典没有证据表明我试图替换任何东西:
class PlaceDetail(APIView):
def get(self, request, pk, format=None):
place = Place.objects.select_related().get(pk=pk)
serializer = PlaceSerializer(place)
#serializer.data['tags'] = pivot_tags(serializer.data['tags'])
serializer.data['test'] = 'asdf'
print(serializer.data['test'])
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
终奌站: KeyError: 'test'
我通过打印观察到这serializer.data是一本字典.
我还测试了我尝试使用的语法应该工作:
>>> test = {'a': 'Alpha'}
>>> test
{'a': 'Alpha'}
>>> test['a']
'Alpha'
>>> test['a'] = 'asdf'
>>> test
{'a': 'asdf'}
Run Code Online (Sandbox Code Playgroud)
如何正确修改serializer.data字典?
Rik*_*kka 16
该Serializer.data属性返回一个OrderedDict使用的构造serializer._data.返回值serializer._data本身不是.
因此改变返回值serializer.data不会改变serializer._data成员.因此,以下调用serializer.data不会更改.
# In class Serializer(BaseSerializer)
@property
def data(self):
ret = super(Serializer, self).data
return ReturnDict(ret, serializer=self)
# In class ReturnDict(OrderedDict)
def __init__(self, *args, **kwargs):
self.serializer = kwargs.pop('serializer')
super(ReturnDict, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
您可以保留一个返回值的副本serializer.data,它是一个有序字典,并根据需要进行操作.
例:
# keep the return value of serializer.data
serialized_data = serializer.data
# Manipulate it as you wish
serialized_data['test'] = 'I am cute'
# Return the manipulated dict
return Response(serialized_data)
Run Code Online (Sandbox Code Playgroud)
为什么:
如果你看一下Django Restframework的源代码,你会在Serializer课堂上看到,
Serializer._data 只是一个普通的字典. Serializer.data是一种装饰成像财产一样的方法.它返回一个ReturnDict对象,该对象是派生自的自定义类OrderedDict.返回的ReturnDict对象使用键/值对初始化Serializer._data.如果直接Serializer.data返回Serializer._data,那么您的原始方法将按预期工作.但它不起作用,因为它返回另一个使用构造的类字典对象Serializer._data.
请记住,返回值Serializer.data不是Serializer._data,而是一个有序的字典对象.操纵返回值不会改变Serializer._data.
我相信serializer.data不serializer._data直接返回的原因是为了避免数据的意外更改并返回一个漂亮的表示serializer._data.
| 归档时间: |
|
| 查看次数: |
6016 次 |
| 最近记录: |