【发布时间】:2016-11-13 22:54:05
【问题描述】:
考虑这种情况,我有一个 Book 和 Author 模型。
序列化器.py
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = models.Author
fields = ('id', 'name')
class BookSerializer(serializers.ModelSerializer):
author = AuthorSerializer(read_only=True)
class Meta:
model = models.Book
fields = ('id', 'title', 'author')
viewsets.py
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
如果我发送 GET 请求一本书,这会非常有用。我得到一个包含书籍详细信息和嵌套作者详细信息的嵌套序列化程序的输出,这正是我想要的。
但是,当我想创建/更新一本书时,我必须发送POST/PUT/PATCH,其中包含作者的嵌套详细信息,而不仅仅是他们的 ID。我希望能够通过指定作者 ID 而不是整个作者对象来创建/更新书籍对象。
所以,对于 GET 请求,我的序列化程序看起来像这样
class BookSerializer(serializers.ModelSerializer):
author = AuthorSerializer(read_only=True)
class Meta:
model = models.Book
fields = ('id', 'title', 'author')
对于POST、PUT、PATCH 请求,我的序列化程序看起来像这样
class BookSerializer(serializers.ModelSerializer):
author = PrimaryKeyRelatedField(queryset=Author.objects.all())
class Meta:
model = models.Book
fields = ('id', 'title', 'author')
我也不想为每种类型的请求创建两个完全独立的序列化程序。我只想修改BookSerializer 中的author 字段。
最后,有没有更好的方法来做这整个事情?
【问题讨论】:
-
查看django-rest-framework.org/api-guide/routers - 根据您的需要添加装饰器。
-
@dmitryro 我不明白。你能进一步解释一下吗?添加装饰器如何修改序列化器的字段?
-
您必须创建一个自定义路由器来处理不同的请求方法 - POST、GET、PUT,并根据您要使用的请求方法装饰您的方法 - 文档提供了一些示例。另见stackoverflow.com/questions/28957912/…
标签: django django-rest-framework django-serializer