当前位置: 首页 > 面试题库 >

在Django Rest Framework上对嵌套序列化器的唯一验证

慕俊语
2023-03-14
问题内容

我有这样的情况,您有一个带有唯一字段的自定义嵌套序列化程序关系。样品盒:

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”
的流派必须唯一,这是事实,但是我只是尝试关联对象而不是一起创建。

十分感谢!!


问题答案:

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

class GenreSerializer(serializers.ModelSerializer):

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

您可能需要先打印序列化程序,以确保该字段上没有其他验证程序。如果有,则必须将它们包括在列表中。

编辑:如果需要确保创建的唯一性约束,则应在serializer.is_valid调用之后和之前在视图中进行操作serializer.save



 类似资料:
  • 我对对象接口的jackson序列化有问题。 我有课 哪个实现 还有上课 哪个实现 上课 我要和Jackson连载Container得到结果 但事实上我得到了结果 尽管我在映射中指定了点的序列化类型(),但在嵌套对象“point”中具有属性“name”。接口点视图没有方法getName,但结果中存在点的字段“name”。 若我从类容器中的方法getMap中删除注释(),我将得到结果 现在点没有属性"

  • 考虑: 如果我们序列化Foo(),输出是: 我想要: 最干净的方法是什么?

  • 问题内容: 有一个简单的POJO- 内部带有子类别。嵌套可能会很深,因为每个子类别都可能包含子子类别,依此类推。我想通过jersey 返回为REST资源,序列化为json(由jackson提出)。问题是,我不能真正限制序列化的深度,因此所有类别树都可以序列化。 有没有办法在完成第一级(即具有其第一级子类别)后立即停止对杰克逊进行序列化的对象? 问题答案: 如果可以从POJO中获取当前深度,则可以使

  • 注意:和是第三方类。所以我不能注释这些。

  • 但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?