【问题标题】:How to catch sql error in Django Rest Framework serializer?如何在 Django Rest Framework 序列化程序中捕获 sql 错误?
【发布时间】:2020-08-02 04:37:37
【问题描述】:

我有一个 Django Rest Framework 端点,外部方向其发送大量数据。因为它每秒运行大约 200 次插入,所以我检查了它所做的查询。我发现它实际上首先做了一个 SELECT 查询来检查是否有重复的 id。由于我认为不会有任何(或至少不会有很多)重复键,我想禁用该检查。所以我将这一行添加到我的序列化器中:

id = serializers.UUIDField(validators=[])  # Disable the validators for the id, which improves performance (rps) by over 200%

正如您在评论中看到的那样,它极大地提高了性能。但是,它的一个缺点是,如果实际上发布了重复的密钥,它会给出 500 错误,说

duplicate key value violates unique constraint

我怎样才能捕捉到这个数据库错误并返回一个简洁的响应而不是抛出这个 500 错误?

【问题讨论】:

    标签: python django postgresql django-rest-framework


    【解决方案1】:

    一种方法是重写序列化程序的create 方法来捕获错误。

    from django.db import IntegrityError
    from django.core.exceptions import ValidationError
    
    from rest_framework import serializers
    
    class MySerializer(serializers.ModelSerializer):
    
        [ ... ]
    
        def create(self, validated_data):
            try:
                return super().create(validated_data)
            except IntegrityError as e:
                raise serializers.ValidationError(str(e))
    

    如果您在对象上允许PUT,您还必须覆盖序列化程序的update

    根据您的用例,放置挂钩可能会更好。它必须在序列化程序的某个地方,并且 try-catch 必须在对象 save() 方法被调用的地方。对您而言,使用与上面大致相同的代码覆盖序列化程序的 save() 方法可能会起作用。

    【讨论】:

      猜你喜欢
      • 2020-05-23
      • 1970-01-01
      • 2019-05-23
      • 2020-12-09
      • 1970-01-01
      • 2015-07-24
      • 2015-06-16
      • 1970-01-01
      相关资源
      最近更新 更多