微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决以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 中使用此代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。