Python IntegrityError:唯一约束失败,如何捕获和响应
我正在用Django REST框架制作一个市场应用程序,这是我的新手 我编写了一个测试来测试unique together字段。它按我所希望的那样工作,当字段author和target在一起不是唯一的时,会引发唯一约束失败错误,但我的问题是如何处理此错误,以便我的测试能够通过 models.pyPython IntegrityError:唯一约束失败,如何捕获和响应,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在用Django REST框架制作一个市场应用程序,这是我的新手 我编写了一个测试来测试unique together字段。它按我所希望的那样工作,当字段author和target在一起不是唯一的时,会引发唯一约束失败错误,但我的问题是如何处理此错误,以便我的测试能够通过 models.py class Review(models.Model): FEEDBACK_CHOICES = [ ('POSITIVE', 'positive'), ('NEUT
class Review(models.Model):
FEEDBACK_CHOICES = [
('POSITIVE', 'positive'),
('NEUTRAL', 'neutral'),
('NEGATIVE', 'negative')
]
feedback = models.CharField(
max_length=8,
choices=FEEDBACK_CHOICES,
default='NEGATIVE'
)
review = models.TextField(max_length=200)
target = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name='reviews',
on_delete=models.CASCADE
)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name='given_reviews',
on_delete=models.CASCADE
)
created = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['created']
unique_together = ['author', 'target']
序列化程序.py
class ReviewSerializer(serializers.ModelSerializer):
target = serializers.PrimaryKeyRelatedField(
queryset=User.objects.all()
)
author = serializers.ReadOnlyField(source='author.id')
class Meta:
model = Review
fields = [
'id',
'feedback',
'review',
'target',
'author',
'created'
]
views.py
class ReviewViewSet(viewsets.ModelViewSet):
queryset = Review.objects.all()
serializer_class = ReviewSerializer
permission_classes = [
ReviewPermissions
]
def perform_create(self, serializer):
serializer.save(author=self.request.user)
这在以下章节中进行了描述:
如果仅给出预期的_异常和预期的_消息参数,则返回上下文管理器,以便测试的代码可以内联编写,而不是作为函数编写:
但这是为了模型级的测试
如果使用DRF的测试客户端,则应检查响应状态是否为200,并覆盖ApiView或相关方法中的异常处理程序,以便确定原因并在响应中提供使其可测试的数据。然后检查客户机的响应,方法与使用时相同
例如,您可以返回一个json响应,如下所示:
{
success: false,
code: INTEGRITY_UNIQUE_ERROR,
message: this could contain details you could test for, like field names
}
重写handle_exception方法是我的选择。它确实引发了另一个TransactionError,但我通过从ApitTransactionTestCase而不是ApitTestCase子类化我的测试模块来修复了这个问题
{
success: false,
code: INTEGRITY_UNIQUE_ERROR,
message: this could contain details you could test for, like field names
}