以json格式获取django_rest_framework中的错误信息

问题描述

我想收到错误信息

{
    "phone": [
        "user with this phone already exists."
    ]
}

JSON 格式,如 {"error": "user with this phone already exists."} 来自回复

HTTP 400 Bad Request
Allow: GET,POST,HEAD,OPTIONS
Content-Type: application/json
vary: Accept

{
    "phone": [
        "user with this phone already exists."
    ]
}

但我得到的只是VM8:1 POST http://127.0.0.1:8000/users/ 400 (Bad Request) 这是我的代码

Serializers.py

class UserCreateSerializer(UserCreateSerializer):
    class Meta:
        model = User
        fields = ('id','first_name','last_name','email','phone','stream','school',"password",)

Models.py

class User(AbstractBaseUser,PermissionsMixin):
    id = models.AutoField(primary_key=True)
    first_name = models.CharField(_('first name'),max_length=30)
    last_name = models.CharField(_('last name'),max_length=30,null=True)
    email = models.EmailField(_('email address'),unique=True)
    phone = models.CharField(_('phone'),max_length=15,unique=True)
    stream = models.CharField(_('stream'),max_length=25)
    school =  models.CharField(_('school'),max_length=40)
    tests_given = ArrayField(models.IntegerField(),null=True,blank=True)
    messages = ArrayField(models.CharField(max_length=100),blank=True)
    is_active = models.BooleanField(_('active'),default=True)
    is_staff =models.BooleanField(_('staff'),default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    required_FIELDS = ['first_name','phone']

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
    
    def __str__(self) :
        return f"{self.first_name}"

Here is what I get from postmanand its what I get from browser when I call an API from react app

解决方法

在视图中的 serializer.is_valid() 中添加 raise_exception=True

def post(self,request):
   serializer = UserCreateSerializer(request.data,many=False)
   if serializer.is_valid(raise_exception=True):
        serializer.save()
        return Response(serializer.data,status=status.HTTP_202_ACCEPTED)
   return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
,

这里是你如何实现它 -

from django.db import IntegrityError

    def post(self,request):
    
       serializer = UserCreateSerializer(request.data,many=False)
    
       serializer.is_valid(raise_exception=True):
           
        try:
    
        serializer.save()
           
        except IntegrityError:
    
            return Response({"error":"User with this phone already exists."},status=status.HTTP_406_NOT_ACCEPTABLE)
    
        return Response("msg":"User created.",status=status.HTTP_200_OK)

如果为 User 提供的值已存在于 db 表中,您的 IntegrityError 模型将引发 phone 异常。您可以通过将 serializer.save() 放在 try.. catch 块中来处理此问题。

您可以在 views.py 中使用此代码。