根据url Django发送不同的错误

时间:2017-05-04 21:41:30

标签: python django django-admin django-rest-framework

我在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

谢谢

1 个答案:

答案 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