Django Rest框架上的嵌套序列化程序的独特验证 [英] Unique validation on nested serializer on Django Rest Framework

查看:105
本文介绍了Django Rest框架上的嵌套序列化程序的独特验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的情况,你有一个自定义嵌套的序列化关系与一个唯一的字段。示例案例:

  class GenreSerializer(serializers.ModelSerializer):

class Meta:
fields =('name',)#这个字段是唯一的
model =类型

class BookSerializer(serializers.ModelSerializer):

genre = GenreSerializer()

class Meta:
model = Book
fields =('name','genre')

def create(self,validated_data):
genre = validated_data.pop('genre')
genre = Genre.objects.get(** genre)
返回Book.objects.create(genre = genre,** validated_data)

问题:当我尝试保存像{name的json对象时: 王子,类型:{name:历史}} DRF尝试验证类型对象唯一约束,如果历史记录存在会引起异常,因为具有名称的类型历史必须是唯一的,这是真的,但我只是试图关联



谢谢你很多!!

解决方案

您应该删除嵌套序列化程序的唯一验证器:

  class GenreSerializer(serializers.ModelSerializer):

class Meta:
fields =('name',)#这个字段是唯一的
model =类型
extra_kwargs = {
'name':{'validators' :[]},
}

您可能希望打印您的序列化程序,以确保您没有在该字段上的其他验证器。如果你有一些,你必须将它们包括在列表中。


I have a case like this, where you have a custom nested serializer relation with a unique field. Sample case:

class GenreSerializer(serializers.ModelSerializer):

    class Meta:
        fields = ('name',) #This field is unique
        model = Genre

class BookSerializer(serializers.ModelSerializer):

    genre = GenreSerializer()

    class Meta:
        model = Book
        fields = ('name', 'genre')

    def create(self, validated_data):
        genre = validated_data.pop('genre')
        genre = Genre.objects.get(**genre)
        return Book.objects.create(genre=genre, **validated_data)

The problem: When i try to save a json object like {"name":"The Prince", "genre": {"name": "History"}} DRF try to validate the genre object unique constraint and if "History" exists throw me an exception because a genre with name "History" must be unique, and that's true but i just trying to relate the object and not create together.

Thank you a lot!!

解决方案

You should drop the unique validator for the nested serializer:

class GenreSerializer(serializers.ModelSerializer):

    class Meta:
        fields = ('name',) #This field is unique
        model = Genre
        extra_kwargs = {
            'name': {'validators': []},
        }

You may want to print your serializer before to make sure you don't have other validators on that field. If you have some, you'll have to include them in the list.

这篇关于Django Rest框架上的嵌套序列化程序的独特验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆