首页 文章

Django IntegryError响应不起作用

提问于
浏览
-1

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

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

这是相关的代码:

apy.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."
        })

serializers.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', )

models.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”:[“此关键字不允许”]}

输出if关键字是唯一的并且在AllowedKeyword {“id”:11,“keyword”:“bitcoin”}

Outout如果关键字中已存在关键字且位于AllowedKeyword {“keyword”:“bitcoin”}

=>但是在捕获IntegrityError之后应该是Response

我希望你们能帮助我干杯

EDIT

如果我使用raise ValidationError而不是Response它可以工作,但我希望在json中出现此错误

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

/ api / keywords / UNIQUE约束中的IntegrityError失败:news_keyword.keyword,news_keyword.owner_id

我只是想捕获这个错误并响应json响应

1 回答

  • 0

    我有了一个想法,现在我尝试了另一种方式 . 我在序列化器中实现了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
    

相关问题