2016-02-09 4 views
0

В Django Rest Framework Я применил сериалы, виды и маршрутизаторы. Всякий раз, когда я отправляю POST с преднамеренной ошибкой в ​​представлении API среды django rest, он генерирует ошибку целостности. Есть ли способ, чтобы попытаться поймать ошибки, как если нет ошибок в данных просто продолжить, чтобы сохранить, однако, если есть ошибки бросить JSON ответ со списком ошибок, таких как:Ошибка целостности Django Rest Framework Catch

[{'section':'This field can not be blank', 'first_name':'This field can not be blank', 'middle_name':'This field can not be blank', 'last_name':'This field can not be blank'}] 

models.py

from django.db import models 

# Create your models here. 
# class AuditTable(models.Model): 
# date_created = models.DateTimeField(auto_now_add=True) 
    # test_field = models.CharField(max_length=50, null=True, blank=True) 

class Section(models.Model): 
    name = models.CharField(max_length=50, default=None) 

    def __str__(self): 
     return self.name 

class Student(models.Model): 
    section = models.ForeignKey(Section, default=None) 
    first_name = models.CharField(max_length=50, default=None) 
    middle_name = models.CharField(max_length=50, default=None) 
    last_name = models.CharField(max_length=50, default=None) 

    def __str__(self): 
     full_name = "%s %s %s" % (self.first_name, self.middle_name, self.last_name) 
     return full_name 

serializers.py

from rest_framework import serializers 
from rest_framework.response import Response 

from . models import * 

class SectionSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Section 
     fields = ('name',) 

class StudentSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Student 
     fields = ('section', 'first_name', 'middle_name', 'last_name') 

viewsets.py

from rest_framework import viewsets 

from . serializers import * 
from . models import * 

class SectionViewSet(viewsets.ModelViewSet): 
    queryset = Section.objects.all() 
    serializer_class = SectionSerializer 

class StudentViewSet(viewsets.ModelViewSet): 
    queryset = Student.objects.all() 
    serializer_class = StudentSerializer 

routers.py

from rest_framework import routers 

from . viewsets import * 

# Routers provide an easy way of automatically determining the URL conf. 
router = routers.DefaultRouter() 
router.register(r'students', StudentViewSet) 
router.register(r'sections', SectionViewSet) 

urls.py

from django.conf.urls import include, url 

from . import views 
from . routers import router 

urlpatterns = [ 
    url(r'^$', views.index, name='testing_sample_index'), 
    url(r'^restful-form/$', views.web_service_form, name='testing_sample_web_service'), 

    url(r'^api/', include(router.urls)), 
] 
+0

Что вы собираетесь поместить в ваши поля, на спасение, если не было никакого входа? Некоторые значения по умолчанию? –

+0

Просто пустое, я намеренно сделал это, чтобы получить ответ на ошибки сериализатора –

ответ

1

По умолчанию CreateMixin реализация raises an exception любой ошибки проверки. Таким образом, вы можете написать свой собственный подмешать ...

class VerboseCreateModelMixin(object): 
    """ 
    Create a model instance and return either created object or the validation errors. 
    """ 
    def create(self, request, *args, **kwargs): 
     serializer = self.get_serializer(data=request.data) 
     if serializer.is_valid(): 
      self.perform_create(serializer) 
      headers = self.get_success_headers(serializer.data) 
      return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) 
     else: 
      return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

... и затем использовать его в вашем ViewSet:

class SectionViewSet(VerboseCreateModelMixin, viewsets.ModelViewSet): 
    queryset = Section.objects.all() 
    serializer_class = SectionSerializer 
1

Если у вас есть IntegrityError то ваши модели не в курсе с вашей базой данных.

Вы должны установить ограничение уникальности в соответствии с вашей схемой БД.

Обратите внимание, что ФПИ может подтвердить против ограничений уникальности с UniqueValidator