【问题标题】:UniqueValidator in drfdrf中的UniqueValidator
【发布时间】:2021-02-03 15:09:13
【问题描述】:

我的模型有一个字段:

name = models.CharField(max_length=255, blank=True, null=True)

在序列化程序中,我试图引发一个唯一的验证错误

name = serializers.CharField(validators=[UniqueValidator(queryset=Department.objects.all(),
                                        message=("Name already exists"))])

但它不起作用,因为数据以name: {en: "drink"}这种格式进入序列化程序,在db字段中仅填充drink

我可以在create 方法中引发错误,但我想在序列化程序上引发错误。感谢任何建议。我很急。给您带来的不便敬请谅解。

提前致谢

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    您可以在 Serializers.py 中的元类下方执行此操作,因为它会引发错误说错误名称必须是唯一的

    class Meta:
        model = YourModel
    
        fields= ('name',) 
        extra_kwargs = {
                    'name': {
                        'validators': [
                            UniqueValidator(
                                queryset=YourModelName.objects.all()
                            )
                        ]
                    }
                }
    

    【讨论】:

      【解决方案2】:

      我强烈建议您使用 Django Rest Framework 的序列化程序 Field-Level Validation,它允许您对字段进行自定义验证。

      如下:

          name = serializers.CharField()
          ...
          def validate_name(self, value):
              # I assumed that you will that the string value, is a JSON object.
              entered_name = json.loads(value).get('en', None)
              if entered_name and Department.objects.filter(name__exact=entered_name).exists():
                  raise serializers.ValidationError("Name already exists!")
              # You need to return the value in after validation.
              return value
           ...
      
      

      【讨论】:

      • 非常感谢您的回答!这看起来像我正在寻找的东西。问题是当我尝试实现此代码时,它从未达到此验证。可能是什么问题?
      【解决方案3】:

      我没有使用UniqueValidator,所以我黑了UniqueTogetherValidator

      像这样;

      导入它:

      from rest_framework.validators import UniqueTogetherValidator

      然后:

      class NameSerializer(serializers.ModelSerializer):
          class Meta:
              model = NameOfModel
              fields = ['id', 'name']
              validators = [
                  UniqueTogetherValidator(
                      queryset=NameOfModel.objects.all(),
                      fields=['name']
                  )
              ]
      

      如果您希望名称字段是唯一的。

      参考:[这里]:https://www.django-rest-framework.org/api-guide/validators/#uniquetogethervalidator

      【讨论】:

        猜你喜欢
        • 2022-06-30
        • 1970-01-01
        • 2012-02-09
        • 2017-12-17
        • 2020-05-14
        • 1970-01-01
        • 2022-06-18
        • 1970-01-01
        • 2019-09-03
        相关资源
        最近更新 更多