Django-Rest-Framework 序列化器unique自定义错误消息不生效问题
问题原因
DRF 为ModelSerializer的OneToOneField自动生成UniqueValidator校验器时,默认使用内置的唯一错误提示,优先级高于你在模型字段、序列化器extra_kwargs中配置的自定义错误信息,因此自定义提示无法生效。
解决方案
方案1:显式指定校验器的错误消息
在序列化器中手动定义user字段,替换默认生成的校验规则,传入自定义错误消息:
from rest_framework import serializers from rest_framework.validators import UniqueValidator from .models import Customer, PersonDiscount class PersonDiscountPostSerializer(serializers.ModelSerializer): user = serializers.PrimaryKeyRelatedField( queryset=Customer.objects.all(), validators=[ UniqueValidator( queryset=PersonDiscount.objects.all(), message=_('A discount setting is already set up for this customer.') ) ] ) class Meta: model = PersonDiscount fields = '__all__'
方案2:手动编写校验逻辑(兼容性最强)
重写字段校验方法,主动判断重复,不受DRF自动校验逻辑影响,所有版本都适用:
from rest_framework import serializers from .models import PersonDiscount class PersonDiscountPostSerializer(serializers.ModelSerializer): class Meta: model = PersonDiscount fields = '__all__' def validate_user(self, value): if PersonDiscount.objects.filter(user=value).exists(): raise serializers.ValidationError(_('A discount setting is already set up for this customer.')) return value
如果需要返回中文错误提示,直接将上述代码中message参数的内容替换为中文即可,修改完成后重启服务就能看到自定义错误提示生效。
内容的提问来源于stack exchange,提问作者Linh Nguyen
相关产品推荐
相关产品推荐

