2017-05-04 74 views
2

我在Django工作,我有,我寫了一個住在model.py根據URL的Django

這個驗證應該返回一個validationError當輸入是壞的自定義驗證的情況下發送不同的錯誤。

在我正在開發的項目中,我們正在爲我們的管理控制檯使用Django Rest Framework和Django管理面板。他們連接到相同的數據庫

我的問題是,當請求來自API我需要返回一個'serializers.ValidationError'(其中包含狀態代碼400),但是當請求來自管理面板我想返回一個在管理面板上工作的'django.core.exceptions.ValidationError'。異常.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

基本上我想送錯誤a當請求從管理面板和errorB到來時,請求從API來

謝謝

+0

我不明白的API和Django的管理是如何linked.also 「的exceptions.ValidationError不會在API中正確顯示」 太模糊有幫助。 – Linovia

+0

他們沒有鏈接,他們只是使用相同的數據庫。基本上我想在請求來自管理面板時發送errorA,當請求來自API時,發送errorB – purplefloyd

回答

0

爲了提出不同的錯誤類別,寫入不同的驗證器。

休息框架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