为了账号安全,请及时绑定邮箱和手机立即绑定

IntegrityError: UNIQUE constraint failed,如何捕捉和响应

IntegrityError: UNIQUE constraint failed,如何捕捉和响应

一只名叫tom的猫 2022-11-29 15:18:08
我正在使用我不熟悉的 Django REST 框架制作市场应用程序。我写了一个测试来测试 unique together 字段。它按我想要的方式工作,当字段 author 和 target 不是唯一在一起时引发 UNIQUE constraint failed 错误,但我的问题是我应该如何处理这个错误以便我的测试通过。models.pyclass 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']serializers.pyclass 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.pyclass ReviewViewSet(viewsets.ModelViewSet):    queryset = Review.objects.all()    serializer_class = ReviewSerializer    permission_classes = [        ReviewPermissions    ]    def perform_create(self, serializer):        serializer.save(author=self.request.user)
查看完整描述

1 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这在文档中有描述:


如果只给出了 expected_exception 和 expected_message 参数,则返回一个上下文管理器,以便被测试的代码可以内联而不是作为函数编写:


with self.assertRaisesMessage(ValueError, 'invalid literal for int()'):

    int('a')

但这是针对模型级别的测试。


如果您使用 DRF 的测试客户端,您应该检查 200 以外的响应状态并覆盖handle_exceptionApiView 中的异常处理程序或相关方法,以便您可以确定原因并在响应中提供使其可测试的数据。然后,您可以像使用Django 的 Test Client一样检查客户端的响应。


例如,您可以像这样返回一个 json 响应:


{

    success: false,

    code: INTEGRITY_UNIQUE_ERROR,

    message: this could contain details you could test for, like field names

}


查看完整回答
反对 回复 2022-11-29
  • 1 回答
  • 0 关注
  • 291 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信