对 Django Rest Framework 上的嵌套序列化程序的唯一验证 [英] Unique validation on nested serializer on Django Rest Framework

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

问题描述

我有一个这样的案例,您有一个带有唯一字段的自定义嵌套序列化程序关系.示例案例:

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)

问题:当我尝试保存像 {"name":"The Prince", "genre": {"name": "History"}} 这样的 json 对象时,DRF 尝试验证流派对象唯一约束,如果 "History" 存在,我会抛出一个异常,因为名为 "History" 的流派必须是唯一的,这是真的,但我只是想联系对象而不是一起创建.

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.

非常感谢!!

推荐答案

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

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.

如果需要保证创建的唯一性约束,应该在serializer.is_valid被调用之后,serializer.save之前在视图中进行.

If you need to ensure the uniqueness constraint for creation, you should do it in the view after the serializer.is_valid has been called and before serializer.save.

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

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