我读了一本drf3的修改版,但对我来说还不清楚。以前,我有以下序列化程序:
class TestSerializer(serializers.Serializer):
att1= serializers.CharField()
att2= serializers.CharField()
att3= serializers.CharField(required=False) 当我传递对象时,其中只有att1和att2值--它工作正常,没有错误,输出中没有属性。但现在如果我不犯att3,我就错了
在试图获取序列化程序KeyError上的字段
att3值时获得TestSerializer。 序列化程序字段的命名可能不正确,并且不匹配EasyDict实例上的任何属性或键。 原始的例外文本是: att3‘。
但根据发布的说明:
required=False:该值不需要显示在输入中
所以代码对我来说是有效的,否则我就不明白了。
data = TestSerializer(s.get_results()).data其中,缺少get_results att3的EasyDict实例:
class EasyDict(dict):
def __init__(self, d=None, **kwargs):
if d is None:
d = {}
if kwargs:
d.update(**kwargs)
for k, v in d.items():
setattr(self, k, v)
# Class attributes
for k in self.__class__.__dict__.keys():
if not (k.startswith('__') and k.endswith('__')):
setattr(self, k, getattr(self, k))
def __setattr__(self, name, value):
if isinstance(value, (list, tuple)):
value = [self.__class__(x) if isinstance(x, dict) else x for x in value]
else:
value = self.__class__(value) if isinstance(value, dict) else value
super(EasyDict, self).__setattr__(name, value)
self[name] = value它在drf2中运行得很好,但是在升级到drf3之后却出现了这个错误。
发布于 2014-12-22 16:32:14
Django REST Framework使用序列化器来序列化(输出)和反序列化(输入)数据。
在您的情况下,很难判断您是在序列化还是反序列化您的数据,但是您会发现两者都存在问题,所以我将对这两种情况给出一个答案。
在反序列化数据时,应该在使用data关键字参数时传递要反序列化的数据,并(可选)传递使用instance关键字参数更新的实例。
serializer = TestSerializer(data=s.get_results())
if serializer.is_valid():
data = serializer.data这应该像预期的那样工作,直到在序列化程序上调用.data为止。这是因为调用.data之后将基于临时实例再次序列化数据对象,您将在下面了解到这仍然是一个问题。
需要注意的是,在反序列化数据时,required=False参数将阻止Django REST框架要求字段存在。
序列化数据时,需要使用instance关键字参数传递完整的对象表示,这也是第一个位置参数。Django REST Framework期望传入的对象将拥有所请求的所有字段,即使它们是null (None)或空白。因为我们正在序列化数据,所以需要确保将字典(或可比较的对象)与序列化程序所需的所有键一起传入字典(或可比较的对象)。
但是,有一种特殊情况,即对象正在反序列化,然后使用相同的对象进行序列化。在这种情况下,即使输入没有提供可选字段,已经创建的基础对象也必须具有可选字段。
发布于 2015-03-04 00:42:02
我点击相同的东西,看看里面的代码,还读了文档,我发现:
http://www.django-rest-framework.org/api-guide/serializers/#inspecting-a-modelserializer
序列化多个对象 若要序列化查询集或对象列表而不是单个对象实例,应在实例化序列化程序时传递many=True标志。
我的2.x代码是:
CollectionSerializer(集合).data
改为:
CollectionSerializer(集合,many=True).data
问题解决了。
https://stackoverflow.com/questions/27603669
复制相似问题