我有一个允许用户注册帐户的API端点.对于重复的用户名,我想返回HTTP 409,而不是400.

以下是我的串行化程序:

from django.contrib.auth.models import User
from rest_framework.serializers import ModelSerializer

class UserSerializer(ModelSerializer):
    username = CharField()

    def validate_username(self, value):
        if User.objects.filter(username=value).exists():
            raise NameDuplicationError()
        return value


class NameDuplicationError(APIException):
    status_code = status.HTTP_409_CONFLICT
    default_detail = u'Duplicate Username'

当错误被触发时,响应为:{"detail":"Duplicate Username"}.我意识到,如果我子类APIException,则使用键detail而不是username.

我想要这个回复,而不是{"username":"Duplicate Username"}

或者,我想在引发ValidationError时指定一个状态代码:

def validate_username(self, value):
    if User.objects.filter(username=value).exists():
        raise serializers.ValidationError('Duplicate Username', 
                                          status_code=status.HTTP_409_CONFLICT)
    return value

但这不起作用,因为ValidationError只返回400.

有没有其他方法可以做到这一点呢?

推荐答案

您可以引发不同的例外,例如:

from rest_framew或k.exceptions imp或t APIException
from django.utils.encoding imp或t f或ce_text
from rest_framew或k imp或t status


class CustomValidation(APIException):
    status_code = status.HTTP_500_INTERNAL_SERVER_ERROR
    default_detail = 'A server err或 occurred.'

    def __init__(self, detail, field, status_code):
        if status_code is not None:self.status_code = status_code
        if detail is not None:
            self.detail = {field: f或ce_text(detail)}
        else: self.detail = {'detail': f或ce_text(self.default_detail)}

您可以在序列化程序中使用它,如下所示:

raise CustomValidation('Duplicate Username','username', status_code=status.HTTP_409_CONFLICT)

raise CustomValidation('Access denied','username', status_code=status.HTTP_403_FORBIDDEN)

Django相关问答推荐

使用django直接计算geohash而不创建模型

把Django测试和testcafe结合起来?

在保存新实例之前删除一个实例(Django模型保存方法)

使用序列化器获取Django ORM auth_user. id数据

DRF中没有参数的视图的警告-壮观

如何在Django CMS中更新上下文

Django Admin:在一个部分中同时显示多个应用程序?

过滤查询以获取两个朋友之间的聊天消息?

Django:获取每组最新的N条记录

Django ModelForm提交按钮不起作用

Django中的 联合(Union) 和相交(Intersect)

如何将表单中的用户字段设置为当前登录的用户?

如果上下文中缺少变量,如何使 Django 模板引发错误

创建新内容类型时出错.请确保在try 单独迁移应用程序之前迁移内容类型

如何覆盖 django 管理员翻译?

Python Django:您正在使用 staticfiles 应用程序而没有设置 STATIC_ROOT 设置

在 Django 中使用 LiveServerTestCase 时使用代码登录

javascript 文件中的 Django {% static 'path' %}

Django Rest 框架 ImageField

Django:在模块中实现 status字段的最佳方式