Django REST Framework序列化器验证名称重复时触发AttributeError
解决DRF序列化器validate_name方法中的AttributeError问题
问题重现
我在Django REST Framework中编写序列化器的validate_name方法,用于验证联系人名称是否已存在,代码如下:
def validate_name(self, value): qs = contact.objects.filter(name=value) if qs.exists(): raise serializers.validationError(f"{value} is already in contact name") return value
运行时触发如下错误:
in validate_name raise serializers.validationError(f"{value} is already in contact name") AttributeError: module 'rest_framework.serializers' has no attribute 'validationError'
解决方案
1. 修正异常类拼写错误
错误核心是大小写拼写错误:DRF提供的验证异常类是ValidationError(首字母大写,第二个E也大写),你写成了小写开头的validationError,导致找不到对应属性。
修正后的基础验证代码:
from rest_framework import serializers def validate_name(self, value): qs = contact.objects.filter(name=value) if qs.exists(): raise serializers.ValidationError(f"{value} 已存在于联系人名称中") return value
2. 额外优化建议
- 模型类命名规范:Python类名应遵循大驼峰规则,建议将
contact改为Contact,避免后续出现其他潜在问题。 - 兼容更新场景:如果该序列化器同时用于创建和更新操作,需要排除当前实例,否则更新时会因为自身名称存在而触发验证错误。优化后的代码:
def validate_name(self, value): qs = Contact.objects.filter(name=value) # 排除当前正在更新的实例 if self.instance: qs = qs.exclude(pk=self.instance.pk) if qs.exists(): raise serializers.ValidationError(f"{value} 已存在于联系人名称中") return value
内容的提问来源于stack exchange,提问作者sridharan
相关产品推荐
相关产品推荐

