【发布时间】:2019-02-10 07:10:29
【问题描述】:
我正在使用 Django DRF 构建一个 api。该api工作得很好。但它会针对不同类型的错误产生不同的响应。假设,如果我添加用户注册功能。我正在使用serializers.ValidationError 函数处理序列化程序中的一些错误。但这正在改变对不同错误的响应。我只想要{"message": "reason for the error", "error": 1} 的标准方式的响应。我不想硬编码。我的意思是我已经使用了多种功能,所以我必须对所有地方进行硬编码。因此,有没有更好的解决方案,比如向序列化程序添加一个函数并从中生成响应???
class UserSerializer(serializers.ModelSerializer):
confirm_password = serializers.CharField(max_length=50, required=True, validators=[password_check], write_only=True)
password = serializers.CharField(max_length=50, required=True, validators=[password_check])
Id = serializers.CharField(max_length=100, required=False, allow_blank=True)
user_type = serializers.CharField(max_length=30, required=True, write_only=True)
email = serializers.EmailField(required=True)
def validate_username(self, username):
if User.objects.filter(username=username):
raise serializers.ValidationError('Username already chosen!')
if len(username) < 8:
raise serializers.ValidationError('Username min length is 8')
return username
def validate_email(self, email):
try:
validate_email(email)
except ValidationError:
raise serializers.ValidationError('Enter a valid email')
if User.objects.filter(email=email):
raise serializers.ValidationError('Email already chosen!')
return email
def validate(self, attrs):
key = 0
try:
if models.Profile.objects.filter(userid=attrs['Id']).exists() and attrs['Id'] != '':
raise serializers.ValidationError('UserId already chosen')
if attrs['Id'] == '':
key=1
except KeyError:
key=1
if key == 1:
if attrs['user_type'] != 'Admin' and attrs['user_type'] != 'AdminCoordinate':
raise serializers.ValidationError("UserId can\'t be empty!")
else:
attrs['user_id'] = ''
if attrs['password'] != attrs['confirm_password']:
raise serializers.ValidationError('Enter same passwords both the times!')
return attrs
class Meta:
model = User
fields = ('pk', 'username', 'password', 'email', 'confirm_password', 'Id', 'user_type')
read_only_fields = ('pk',)
【问题讨论】:
标签: django django-rest-framework