validate
方法中的常见模式是比较两个字段值。例如:
def validate(self, attrs: typing.Dict[str, typing.Any]) -> typing.Dict[str, typing.Any]:
end_datetime = attrs.get('end_datetime', self.instance.end_datetime if self.instance else None)
if not end_datetime:
return attrs
if end_datetime < attrs.get('start_datetime', self.instance.start_datetime if self.instance else None):
raise serializers.ValidationError({'end_datetime': 'This value cannot be before the start datetime'})
return attrs
我目前正在使用由同事开发的帮助程序方法,将上面的attrs.get
调用替换为self._get_input_or_instance_attribute(attrs, 'field_name')
,这基本上是同一件事:使用特定的方法获取attrs
条目名称(如果存在),否则,如果我们要更新现有实例,则获取其当前值。 是否有更好的方法,例如内置属性或方法,以将POST / PUT / PATCH数据与现有实例数据合并(如果适用)?
答案 0 :(得分:0)
如果您打算使用新的请求数据更新实例,则不会。在验证之前不(可能不应该)进行此操作,否则可能会出现错误,因为尚未确认数据的有效性。更新应仅在验证之后进行。 在少数情况下,您必须比较请求数据中的2个字段或使用现有的实例数据,那么您采用的方法很好。如果您有很多这样的情况,那么最好像同事一样使用一种方法