Python IntegrityError:唯一约束失败,如何捕获和响应

Python 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

我正在用Django REST框架制作一个市场应用程序,这是我的新手

我编写了一个测试来测试unique together字段。它按我所希望的那样工作,当字段author和target在一起不是唯一的时,会引发唯一约束失败错误,但我的问题是如何处理此错误,以便我的测试能够通过

models.py

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
}