gpt4 book ai didi

json - 如何使用 Django Rest Framework 反序列化嵌套对象

转载 作者:行者123 更新时间:2023-12-01 09:54:38 25 4
gpt4 key购买 nike

假设我有这样的 Django 模型:

class Book(models.Model):
title = models.CharField(max_length=150)
author = models.CharField(max_length=150)

class Chapter(models.Model):
book = models.ForeignKey(Book, related_name='chapters')
title = models.CharField(max_length=150)
page_num = models.IntegerField()

和 Django Rest Framework 类,如下所示:
class ChapterSerializer(serializers.ModelSerializer):
class Meta:
model = Chapter
fields = ('id', 'title', 'page_num')

class BookSerializer(serializers.ModelSerializer):
chapters = ChapterSerializer(many=True)

class Meta:
model = Book
fields = ('id', 'title', 'author', 'chapters')

def create(validated_data):
chapters = validated_data.pop('chapters')
book = Book(**validated_data)
book.save()
serializer = ChapterSerializer(data=chapters, many=True)
if serializer.is_valid(raise_exception=True):
chapters = serializer.save()

class BookCreate(generics.CreateAPIView):
serializer = BookSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
# Do some other stuff

我发布了一些这样的 JSON:
{
title: "Test book",
author: "Test author",
chapters: [
{title: "Test chapter 1", page_num: 1},
{title: "Test chapter 2", page_num: 5}
]
}

我得到一个异常(exception),因为 chapter没有 book与之相关。如果我添加 book作为 ChapterSerializer的字段之一,那么 JSON 将无法验证,因为 BookSerializerBookCreate不会验证,因为它需要章节的书 ID,但书尚未创建。我该如何解决这种情况?

有没有办法让 BookSerializer验证它自己的字段而不是验证它的 chapter的?

最佳答案

您可以 pass additional arguments.save .所以我认为你只需要将新创建的书实例传递给 serializer ,例如

def create(validated_data):
chapters = validated_data.pop('chapters')
book = Book(**validated_data)
book.save()
serializer = ChapterSerializer(data=chapters, many=True)
if serializer.is_valid(raise_exception=True):
chapters = serializer.save(book=book)

关于json - 如何使用 Django Rest Framework 反序列化嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30765360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com