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

我正在使用我不熟悉的 Django REST 框架制作市场应用程序。


我写了一个测试来测试 unique together 字段。它按我想要的方式工作,当字段 author 和 target 不是唯一在一起时引发 UNIQUE constraint failed 错误,但我的问题是我应该如何处理这个错误以便我的测试通过。


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']

serializers.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)


一只名叫tom的猫
浏览 369回答 1
1回答

MMMHUHU

这在文档中有描述:如果只给出了 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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python