【发布时间】:2019-02-25 14:26:27
【问题描述】:
我在 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)
但是请求仍然返回错误(value too long... 同上)。我预计错误会在序列化程序中被捕获并且值没有传递给模型,为什么值会一直到达模型?
我对此进行了研究,所有solutions 都说将字段长度设为 255。这并不能解释为什么模型首先会测试该值,也不能解释如果以某种方式发生了什么请求中确实会出现比预期更长的值。
对此的任何帮助表示赞赏。
【问题讨论】:
-
这确实是次要的,但它是 Django 的 REST 框架,它不是“Django 的 REST 框架”。 Django 项目不拥有或控制 REST 框架。
标签: python django django-models django-rest-framework django-serializer