【问题标题】:Overriding or blocking validation errors in django rest api在 django rest api 中覆盖或阻止验证错误
【发布时间】:2015-05-30 17:03:18
【问题描述】:

有没有办法覆盖或阻止 django rest 框架中的验证错误。例如,如果我有以下代码

class Function(models.Model):



name = models.CharField(max_length=30, unique=True)

我需要某种方式来阻止 name 的 unique=True。如何在序列化程序中处理?

class FunctionSerializerWithOnlyName(serializers.ModelSerializer):

def validate_name(self, value):
        # it is always returning name needs to be unique even if i raise another error
        return value


class Meta:
    model = Function
    fields = ( 'name',)

【问题讨论】:

    标签: django rest python-2.7 django-rest-framework


    【解决方案1】:

    unique 在数据库级别强制执行。 https://docs.djangoproject.com/en/1.7/ref/models/fields/#unique

    ..所以这是不可能的。您需要从模型字段中删除唯一性并检查代码内的唯一性。

    【讨论】:

    • DRF 还通过他们的验证器手动强制执行此操作,因此可以解决这个问题(通过删除它们)。
    • @KevinBrown 嗯.. 即使您删除了验证器,您不会得到 db 级别的异常吗?
    • 是的,但我猜他们正在以某种方式解决这个问题。他们确实提到了验证错误而不是完整性错误......
    • @mariodev 我在这里做一个 GET。像按名称获取函数这样的东西,所以我不需要那种验证。有没有办法通过 GET 调用阻止验证?
    • @user1200279 GET 根本不应该进行验证。
    【解决方案2】:

    最快的方法是将 FunctionSerializerWithOnlyName 更改为 serializers.Serializer 并取消它与 Function 对象的链接。

    class FunctionSerializerWithOnlyName(serializers.Serializer):
    
    name = serializers.CharField(max_length=30)
    
    def validate_name(self, value):
        try:
            function = Function.objects.get(name=value)
        except:
            raise serializers.ValidationError("The function name '"+value+"' is not available")
        return value
    

    【讨论】:

      猜你喜欢
      • 2018-08-01
      • 2020-03-05
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 2017-03-03
      • 2012-05-19
      • 2019-09-13
      • 2021-08-20
      相关资源
      最近更新 更多