django序列化程序和视图究竟是如何协同工作的?如何将带有查询集的附加数据返回到前端



我使用的是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字段。

相关内容

最新更新