Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 序列化程序中带有验证响应的模型字段长度约束_Python_Django_Django Models_Django Rest Framework_Django Serializer - Fatal编程技术网

Python 序列化程序中带有验证响应的模型字段长度约束

Python 序列化程序中带有验证响应的模型字段长度约束,python,django,django-models,django-rest-framework,django-serializer,Python,Django,Django Models,Django Rest Framework,Django Serializer,我在django的rest框架中使用序列化程序中的数据验证来自请求的数据。我需要在单个响应中发送所有错误消息 发送太长的字符串时,出现错误: django.db.utils.DataError: value too long for type character varying(3) 在我的模型中,我将字符字段的最大长度定义为3(理论上需要的最大长度) 我在序列化程序中添加了验证,以捕获字符过多的请求: 验证器.py class CustomUserValidators(): err

我在django的rest框架中使用序列化程序中的数据验证来自请求的数据。我需要在单个响应中发送所有错误消息

发送太长的字符串时,出现错误:

django.db.utils.DataError: value too long for type character varying(3)
在我的模型中,我将字符字段的最大长度定义为3(理论上需要的最大长度)

我在序列化程序中添加了验证,以捕获字符过多的请求:

验证器.py

class CustomUserValidators():

    errors_to_return = {}
    def val_role(self, role):
            if len(role) > 3:
                self.errors_to_return["role_length"] = "Ensure this field has no more than 3 characters."
序列化程序.py

from Sea.validators import CustomUserValidators
class LagoonUserCreateSerializer(UserCreateSerializer, CustomUserValidators):
    class Meta:
        model = User
        fields = ('id', 'username', 'role',)


    def validate(self, attrs):
        self.val_role(attrs['role'])

        if len(self.errors_to_return) > 0:
            raise serializers.ValidationError(self.errors_to_return)

        return attrs
models.py

class SeaUser(AbstractUser):
    ...
    role = models.CharField(_('Role'), max_length=3)
但是请求仍然返回错误(
值太长…
如上所述)。我期望在序列化程序中捕获erorr,并且值不会传递给模型,为什么值会一直到达模型

我已经研究过了,所有这些都使得字段长度为255。这并不能回答为什么模型首先要测试该值,也不能解释如果请求中的值确实超过预期值,会发生什么


非常感谢您的帮助。

我将采用不同的方法并利用序列化程序的验证

您可以通过向序列化程序添加.validate\u字段方法来指定自定义字段级验证

def validate_role(self, value):
    if len(value) > 3:
        raise serializers.ValidationError("Ensure this field has no more than 3 characters")
    return value
因此,您可以将以下方法添加到序列化程序中

def validate_role(self, value):
    if len(value) > 3:
        raise serializers.ValidationError("Ensure this field has no more than 3 characters")
    return value
并完全删除
CustomUserValidators

如注释中所述,您可以将验证移动到实用程序函数,并在任何需要的地方使用它

def validate_user_role(value):
    return 0 < len(value) <= 3

另一个更简单的解决方案是使用序列化程序的查尔菲属性,这样做:

class LagoonUserCreateSerializer(UserCreateSerializer):
    role = serializers.CharField(min_length=1, max_length=3)

这将在不实现validate_role方法的情况下验证您的输入。

感谢您的帮助,这不是问题所在,但我必须在多个请求中验证角色字段,这就是我使用自定义类的原因,这不被视为良好做法吗?(谢谢你的意见)是的,当然可以。您可以创建实用程序函数来验证输入,并在这个validate_role方法中调用它,然后您可以在任何需要的地方使用它。这将是一种可能的方法。你想添加一个在这种情况下如何使用效用函数的示例吗?根据要求更新了答案。但是考虑我的回答中的最后一个方法——这似乎是最简单和最简单的(除非你计划有更复杂的验证),这是很小的,但是它是Django的REST框架,它不是“Django的REST框架”。Django项目不拥有或控制REST框架。