【发布时间】:2019-10-24 18:47:23
【问题描述】:
假设我有以下模型:
class Author(models.Model):
first_name = models.CharField(max_length=32)
last_name = models.CharField(max_length=32)
class Book(models.Model):
title = models.CharField(max_length=64)
author = models.ForeignKeyField(Author, on_delete=models.CASCADE)
我有以下序列化程序:
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('id', 'title', 'author')
read_only_fields = ('id')
如果我随后查询我的书籍,A book 的数据如下所示:
{
"id": 1,
"title": "Book Title",
"author": 4
}
这是我想要的,因为我返回了一系列书籍以及一系列作者,并允许客户加入所有内容。这是因为我有很多作者在书中重复出现。
但是,我希望允许客户提交现有作者 ID 以创建新书,或提交新作者的所有数据。例如:
现有作者的新书负载:
{
"title": "New Book!",
"author": 7
}
或者,新作者的新书的有效载荷:
{
"title": "New Book!",
"author": {
"first_name": "New",
"last_name": "Author"
}
}
但是,第二个版本不会通过我的序列化程序中的数据验证步骤。有没有办法覆盖验证步骤,允许作者 ID 或完整对象?然后在我的序列化程序的 create 方法中,我可以检查类型,或者创建一个新作者,获取它的 id,然后创建新书,或者只是附加现有的 id。想法?
【问题讨论】:
-
您可以使用nested serializer 使第二个版本真正有效。
-
正确,但是当我这样做时,我得到一个例外,即序列化程序需要第一个版本的字典。
标签: python django serialization django-rest-framework