django DRF中的UniqueValidator

vecaoik1  于 12个月前  发布在  Go
关注(0)|答案(3)|浏览(171)

我的模型有一个字段:

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方法中引发错误,但我想在序列化程序中引发错误。感谢任何建议。我很着急。抱歉给您带来不便。
Thanks in advance

xsuvu9jc

xsuvu9jc1#

我强烈建议你使用Django Rest Framework的Serializer字段级验证,它允许你为你的字段做自定义验证。
如下所示:

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

字符串

uqdfh47h

uqdfh47h2#

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

class Meta:
    model = YourModel

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

字符串

xwbd5t1u

xwbd5t1u3#

我没有使用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']
            )
        ]

字符串
如果您希望名称字段是唯一的。
参考:这里

相关问题