我使用的是react前端和django-rest框架后端,我很难理解视图和序列化程序之间发生了什么。我想将不属于查询集的其他元数据返回到前端。
这是我的应用程序的流程
我的前端调用一个端点:
Server.get("api/books-filtered")
这是用django-rest框架编写的后端路径:
path("books-filtered/", Books.BookList.as_view()),
然后到
class Books(generics.RetrieveAPIView):
serializer_class = BookSerializer
lookup_field = 'id'
lookup_url_kwarg = 'book_id'
def get_queryset(self):
"""Return only queries pertaining to the patient"""
return FilterOutSomeBookRelatedQuerySetHere()
其序列化程序类为:
class BookSerializer():
class Meta:
model = Book
fields = ['Title','Author','Publisher']
我在前端得到了这个:
console.log(Server.get("api/books-filtered"))
// prints [
//{Title:"book 1", Author:"author 1", Publisher:"publisher 1"},
//{Title:"book 2", Author:"author 2", Publisher:"publisher 2"},
//{Title:"book 3", Author:"author 3", Publisher:"publisher 3"}
//]
视图和序列化程序之间发生了什么,导致数据在发送回前端时被格式化为这样?
我如何修改console.log(Server.get("api/books filtered"((打印的内容以包括额外的元数据?像
console.log(Server.get("api/books-filtered"))
// prints [
//{Title:"book 1", Author:"author 1", Publisher:"publisher 1"},
//{Title:"book 2", Author:"author 1", Publisher:"publisher 2"},
//{Title:"book 3", Author:"author 1", Publisher:"publisher 2"},
//[3 books, 2 separate publishers, 1 author]
//]
或类似:
console.log(Server.get("api/books-filtered"))
// prints
// [{Title:"book 1", Author:"author 1", Publisher:"publisher 1", metadata:[1,2,3]},
//{Title:"book 2", Author:"author 1", Publisher:"publisher 2", metadata:[4,5,6]},
//{Title:"book 3", Author:"author 1", Publisher:"publisher 2", metadata:[7,8,9]}
//]
在这里解释DRF的工作方式有点超出范围,但回答您关于如何添加元数据的问题则不然。实际上,通过扩展序列化程序类可以很容易地做到这一点,如下所示:
class BookSerializer(SurveySerializer):
metadata = serializers.SerializerMethodField()
def get_metadata(self, model_instance):
# Use model instance or do another query all together
return [1, 2, 3]
class Meta:
model = Book
fields = ['title', 'author', 'publisher', 'metadata']
以上结果将导致:
[
{Title:"book 1", Author:"author 1", Publisher:"publisher 1", metadata:[1,2,3]},
{Title:"book 2", Author:"author 1", Publisher:"publisher 2", metadata:[1,2,3]},
{Title:"book 3", Author:"author 1", Publisher:"publisher 2", metadata:[1,2,3]}
]
通过使用SerializerMethodField
,您基本上可以通过实现get_metadata
来用您想要的任何内容填充metadata
字段。