Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 升级UserProfile序列化程序时出现完整性错误_Python_Django Rest Framework - Fatal编程技术网

Python 升级UserProfile序列化程序时出现完整性错误

Python 升级UserProfile序列化程序时出现完整性错误,python,django-rest-framework,Python,Django Rest Framework,我正在尝试创建一个更新序列化程序,并为异常集成错误返回一条消息 下面是特定代码行的片段- instance.username = validated_data.get('username', instance.username) if User.objects.filter(username__iexact=instance.username).exists(): raise BaseException 如果不使用Try和Except 更新- 这就是我解决这个问

我正在尝试创建一个更新
序列化程序
,并为
异常
集成错误
返回一条消息

下面是特定代码行的片段-

    instance.username = validated_data.get('username', instance.username)
    if User.objects.filter(username__iexact=instance.username).exists():
        raise BaseException
如果不使用
Try
Except

更新- 这就是我解决这个问题的方法-

    if User.objects.filter(username__iexact=instance.username).exists():
        raise serializers.ValidationError("username already exists")
User.objects.filter(username\uu iexact=instance.username).exists()

这将不起作用,因为实例也是
User
对象,因此它将始终返回
True
,您需要首先排除当前实例

固定查询:

User.objects.exclude(pk=instance.pk).filter(username\uu iexact=instance.username).exists()

我不知道您为什么不想使用
try/catch
,但不管怎样,在遵循好的模式时,您可以做以下几点:

  • Django的
    User
    模型已经具有
    unique=True
    约束
  • 违反唯一约束的模型实例已在调用
    save()
    时抛出一个
    IntegrityError
  • 因此,在您看来,您只需要捕获
    IntegrityError
    ,然后引发
    序列化程序。ValidationError
  • 从rest\u框架导入序列化程序、视图集
    来自rest_framework.exceptions ValidationError
    类UserProfileUpdateViewSet(ViewSet.ModelViewSet):
    def执行_更新(自、序列化程序):
    """
    覆盖该方法
    """
    尝试:
    serializer.save()
    除完整性错误外:
    引发验证错误(
    f“用户名已被占用。请选择其他用户名。”,
    )
    
    你有没有试过把raise BaseException(“你想要的消息”)放进去?@jalazbe是的,我试过了,没什么区别。它返回的结果与发生服务器错误时的BaseException
    相同。请与管理员联系。