gpt4 book ai didi

python - Django Rest Framework 3 必需的字段行为

转载 作者:行者123 更新时间:2023-12-02 01:03:11 26 4
gpt4 key购买 nike

我已经阅读了 drf3 的变更日志,但我仍然不清楚。以前我有以下序列化器:

class TestSerializer(serializers.Serializer):
att1= serializers.CharField()
att2= serializers.CharField()
att3= serializers.CharField(required=False)

当我传递仅包含 att1 和 att2 值的对象时 - 它工作正常,没有错误,输出中没有属性。但现在如果我不通过 att3 我会收到错误

Got KeyError when attempting to get a value for field att3 on serializer TestSerializer.
The serializer field might be named incorrectly and not match any attribute or key on the EasyDict instance.
Original exception text was: att3'.

但根据发行说明:

required=False: The value does not need to be present in the input

所以代码似乎对我有效,或者我不明白一些东西。

 data = TestSerializer(s.get_results()).data

其中 EasyDict 的 get_results 实例缺少 att3:

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 后出现此错误。

最佳答案

Django REST Framework 使用序列化器来序列化(输出)和反序列化(输入)数据。

很难判断您的情况是序列化还是反序列化数据,但您会发现这两种情况都有问题,因此我将为您提供这两种情况的答案。

<小时/>

反序列化数据时,应使用 data 传入要反序列化的数据关键字参数,以及(可选)要使用 instance 更新的实例关键字参数。

serializer = TestSerializer(data=s.get_results())
if serializer.is_valid():
data = serializer.data

这应该按预期工作,直到您调用 .data在序列化器上。这是因为调用.data然后将根据临时实例再次序列化数据对象,您将在下面了解到这仍然是一个问题。

需要注意的是,反序列化数据时,required=False参数将阻止 Django REST Framework 要求该字段存在。

<小时/>

序列化数据时,您需要在使用 instance 时传递完整的对象表示形式关键字参数,也是第一个位置参数。 Django REST Framework 期望传入的对象将具有您请求的所有字段,即使它们是 null ( None ) 或空白。 required=False参数在这里不执行任何操作,因为我们正在序列化数据。因此,您需要确保字典(或类似对象)与序列化程序所需的所有键一起传入。

但是有一种特殊情况,即反序列化对象然后使用同一对象进行序列化。在这种情况下,已创建的基础对象仍必须具有可选字段,即使输入未提供该字段。

关于python - Django Rest Framework 3 必需的字段行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27603669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com