如何使用Django Rest框架反序列化嵌套对象 [英] How to deserialize nested objects with Django Rest Framework

查看:418
本文介绍了如何使用Django Rest框架反序列化嵌套对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

说我有这样的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框架类:

  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屋!

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