Python 序列化程序中带有验证响应的模型字段长度约束
我在django的rest框架中使用序列化程序中的数据验证来自请求的数据。我需要在单个响应中发送所有错误消息 发送太长的字符串时,出现错误: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.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框架。