python - 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 响应
解决方案
我有了一个想法,现在我尝试了另一种方法。我在序列化程序中实现了 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
推荐阅读
- python - 如何逐行读取和写入代码输出到文本文件中
- c++ - 如何在多个函数中操作 ifstream 对象
- unix - grep 和 awk,组合命令?
- ruby-on-rails - Sidekiq 工人重复工作的最佳实践
- git - git remote set-url 和 remote remove 之间的区别然后添加?
- java - 按字母顺序打印列表中每个单词的计数
- cesium - 铯中的这种暗图像是否正常?
- tableau-api - 我可以在一个计算字段中进行多项计算吗?
- r - How to use Rvest to scrape data
- java - Java tomcat线程内存使用限制