我在Django工作,我有一种情况,我写了一个自定义验证器,它位于model.py
当输入错误时,此验证器应返回validationError。
在我正在开发的项目中,我们使用Django Rest Framework作为我们的API,使用Django管理面板作为我们的管理面板。它们连接到同一个数据库
我的问题是,当请求来自API我需要返回'serializers.ValidationError'(其中包含状态代码400),但当请求来自管理面板时我想返回'django .core.exceptions.ValidationError'在管理面板上有效。 exception.ValidationError无法在API中正确显示,并且serializers.ValidationError导致管理面板中断。有什么方法可以将适当的ValidationError发送到适当的位置吗?
这是我的验证功能(它存在于模型中)
def validate_unique(self, *args, **kwargs):
super(OrganizationBase, self).validate_unique(*args, **kwargs)
qs = self.__class__._default_manager.filter(organization_type="MEMBER")
if not self._state.adding and self.pk is not None:
qs = qs.exclude(pk=self.pk)
if qs.exists():
raise serializers.ValidationError("Only one organization with \'Organization Type\' of \'Member\' is allowed.") #api
raise exceptions.ValidationError("Only one organization with \'Organization Type\' of \'Member\' is allowed.") #admin
最后这两行是为了说明而写在一起的两个错误,在这种情况下只有#api会运行
基本上我想在请求来自管理面板时发送errorA,而当请求来自API时发送errorB
谢谢
答案 0 :(得分:0)
为了引发不同的错误类,请编写不同的验证器。
rest framework api:
您可以使用UniqueValidator
或自定义验证功能。检查链接[1]
例如:
class MySerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = (....)
def validate(self, data):
# my validation code
raise serializers.ValidationError(....)
return data
管理员面板:
对于管理面板,您可以使用自定义表单[2]。
例如:
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
def clean(self):
cleaned_data = super(MyForm, self).clean()
# my validation code
raise exceptions.ValidationError(....)
return cleaned_data
class MyAdmin(admin.ModelAdmin):
form = MyForm
在序列化程序和表单中,如果不是,则可以访问实例对象。
[1] http://www.django-rest-framework.org/api-guide/validators/#uniquevalidator
[2] https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form