如何使用Django Rest框架反序列化嵌套对象 [英] How to deserialize nested objects with Django Rest Framework
问题描述
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框架类:
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' )
def create(validated_data):
chapters = validated_data.pop('chapters')
book = Book(** valida ted_data)
book.save()
serializer = ChapterSerializer(data = chapters,many = True)
如果serializer.is_valid(raise_exception = True):
chapters = serializer.save ()
class BookCreate(generics.CreateAPIView):
serializer = BookSerializer(data = request.data)
如果serializer.is_valid(raise_exception = True):
serializer.save()
#做一些其他的东西
:
{
标题:测试书,
作者:测试作者,
章:[
{标题:测试第1章,page_num:1},
{标题:测试第2章,page_num:5}
]
}
我收到一个例外,因为章
有一个书
与它相关联。如果我将 book
添加为 ChapterSerializer
的字段之一,则JSON将无法验证,因为 BookSerializer
在 BookCreate
中将不会验证,因为它将期望这些章节的书籍ID,但该书尚未创建。如何解决这种情况?
有没有办法让 BookSerializer
验证自己的字段,而不是验证其章节
?
您可以在<$ c上传递其他参数 $ C> .save 。所以我想你只需要将新创建的书实例传递给 serializer
,例如
def create(validated_data):
chapters = validated_data.pop('chapters')
book = Book(** validated_data)
book.save()
serializer = ChapterSerializer(data = chapters,many = True)
如果serializer.is_valid(raise_exception = True):
chapters = serializer.save(book = book)
Say I have Django models like this:
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()
and Django Rest Framework classes like this:
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
and I POST some JSON like this:
{
title: "Test book",
author: "Test author",
chapters: [
{title: "Test chapter 1", page_num: 1},
{title: "Test chapter 2", page_num: 5}
]
}
I get an exception because chapter
doesn't have a book
associated with it. If I add book
as one of the fields of ChapterSerializer
, then the JSON will fail to validate because the BookSerializer
in BookCreate
won't validate because it will expect a book id for the chapters, but the book hasn't been created yet. How do I resolve this situation?
Is there a way to have the BookSerializer
to validate its own fields and not to validate its chapter
's?
You can pass additional arguments on .save
. So I think you just need to pass the newly created book instance to the serializer
, e.g.
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)
这篇关于如何使用Django Rest框架反序列化嵌套对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!