小能豆

更新中 DRF HiddenField 的字段级验证

python

对 DRF 进行字段级验证的正确方法是什么serializers.HiddenField()?我尝试过的(假设字段名称是x):

  • validate_x()向序列化器类添加方法。部分更新操作 (HTTP PATCH) 中未调用此方法。
  • 尝试在方法中验证它validate(self, data)。数据字典中不存在。
  • 尝试创建一个验证器并将其传递给验证器字段参数,但它们没有被调用。

在部分更新中为此添加自定义验证的正确方法是什么?我正在使用 DRF v3.12.4

注意:我希望该字段在请求正文定义中隐藏,并且仍然能够验证该字段并将其包含在序列化器中。


阅读 148

收藏
2023-06-28

共1个答案

小能豆

在 Django REST Framework(DRF)中,要进行字段级验证并将字段隐藏在请求正文中,可以使用 serializers.HiddenField() 结合自定义验证方法来实现。下面是正确的做法:

  1. 在序列化器类中定义一个隐藏字段,并将其命名为 x(您提到的字段名称):
class YourSerializer(serializers.Serializer):
    x = serializers.HiddenField(default=serializers.CurrentUserDefault())
    # 其他字段定义

这里的 x 字段是隐藏字段,它使用 serializers.CurrentUserDefault() 设置默认值,您可以根据需要更改默认值的设置。

  1. 在序列化器类中定义一个方法 validate_x(self, value),用于对隐藏字段 x 进行验证。这个方法会在执行 .is_valid() 时自动调用:
class YourSerializer(serializers.Serializer):
    x = serializers.HiddenField(default=serializers.CurrentUserDefault())
    # 其他字段定义

    def validate_x(self, value):
        # 进行字段 x 的验证逻辑
        # 如果验证失败,可以抛出 serializers.ValidationError
        return value

注意,方法名称应该是 validate_x,其中 x 是隐藏字段的名称。在这个方法中,您可以实现对字段 x 的验证逻辑,并根据需要抛出 serializers.ValidationError

通过以上步骤,您定义的隐藏字段 x 将在请求正文中隐藏,并在执行序列化器的验证过程中调用相应的验证方法。

关于部分更新(HTTP PATCH)中的自定义验证,可以按照上述步骤进行操作,即定义隐藏字段并实现相应的验证方法。在部分更新请求中,DRF 会根据请求正文中的数据字段来更新模型实例,然后执行序列化器的验证过程,包括隐藏字段的验证方法。

请注意,上述代码示例中的 YourSerializer 只是一个示例,您需要根据您的实际需求进行适当的调整和更改。

2023-06-28