我正在写一个休息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 回答
我有了一个想法,现在我尝试了另一种方式 . 我在序列化器中实现了validate方法,现在它工作正常
.