首页 > 解决方案 > Django IntegryError 响应不起作用

问题描述

我正在编写一个rest api,用户可以在其中注册、登录和添加关键字。但是只有当它们等于 AllowedKeyword 模型之一时才会添加关键字。到目前为止我已经完成了所有工作,但是如果关键字和所有者的组合已经存在,我必须捕获 IntegrityError。

但是,如果我尝试使用 api 调用它来响应我想添加的关键字(但他没有保存它,这是正确的)而不是 Response 错误。

以下是相关代码:

py.py

class KeywordViewSet(viewsets.ModelViewSet):
permission_classes = [permissions.IsAuthenticated, ]
serializer_class = KeywordSerializer

def get_queryset(self):
    return self.request.user.keywords.all()

def perform_create(self, serializer):
    try:
        serializer.save(owner=self.request.user)
    except IntegrityError as e:
        return Response({
            "IntegrityError": "This combination already exists."
        })

序列化程序.py

def allow_keyword(key):

if AllowedKeyword.objects.filter(allowed_keyword=key).exists():
    return key
else:
    raise serializers.ValidationError('This Keyword ist not allowed')


class KeywordSerializer(serializers.ModelSerializer):
    #keyword = serializers.StringRelatedField()
    keyword = serializers.CharField(max_length=255, validators=[allow_keyword])

    class Meta:
        model = Keyword
        fields = ('id', 'keyword', )

模型.py

class AllowedKeyword(models.Model):
    allowed_keyword = models.CharField(max_length=255, null=True, default=None, blank=True)
    def __str__(self):
        return str(self.allowed_keyword)


class Keyword(models.Model):
    keyword = models.CharField(max_length=255, null=True, blank=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='keywords')

def __str__(self):
    return str(self.keyword)

class Meta:
    unique_together = ('keyword', 'owner')

如果关键字不在 AllowedKeyword { "keyword": [ "This Keyword is not allowed" ] } 中,则输出

如果关键字是唯一的并且在 AllowedKeyword { "id": 11, "keyword": "bitcoin" } 中,则输出

如果关键字中已经存在关键字并且在 AllowedKeyword { "keyword": "bitcoin" } 中,则输出

=> 但应该是捕获 IntegrityError 后的响应

我希望你们能帮助我干杯

编辑

如果我使用 raise ValidationError 而不是 Response 它可以工作,但我希望 json 中有这个错误

编辑 2 有关更多信息,如果我没有发现错误,我会得到这个

/api/keywords/ UNIQUE 约束处的 IntegrityError 失败:news_keyword.keyword、news_keyword.owner_id

我只想捕捉这个错误并响应一个 json 响应

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


我有了一个想法,现在我尝试了另一种方法。我在序列化程序中实现了 validate 方法,现在它工作正常

class KeywordViewSet(viewsets.ModelViewSet):
permission_classes = [permissions.IsAuthenticated, ]
serializer_class = KeywordSerializer

def get_queryset(self):
    return self.request.user.keywords.all()

def perform_create(self, serializer):
    serializer.save(owner=self.request.user)


def allow_keyword(key):

if AllowedKeyword.objects.filter(allowed_keyword=key).exists():
    return key
else:
    raise serializers.ValidationError('This Keyword is not allowed')

.

class KeywordSerializer(serializers.ModelSerializer):
keyword = serializers.CharField(max_length=255, validators=[allow_keyword])

class Meta:
    model = Keyword
    fields = ('id', 'keyword', )

def validate(self, data):
    if Keyword.objects.filter(keyword=data['keyword'], owner=self.context['request'].user).exists():
        raise serializers.ValidationError("combination exists")
    return data

推荐阅读