Django - 使用模型和数据序列化复杂的上下文结构

Posted

技术标签:

【中文标题】Django - 使用模型和数据序列化复杂的上下文结构【英文标题】:Django - serialize complex context structure with models and data 【发布时间】:2021-02-17 02:01:12 【问题描述】:

在 django 视图中,我希望能够序列化整个上下文,这通常用于发送到模板(通常通过调用 render 并传递 locals)。 我想试验 SPA+API 和继续前进的可能性,我想创建函数,将locals 序列化为 json 并将其作为 json 响应返回。

现在的问题是,本地通常是模型的列表、分布和查询集的混合。 我可以使用django.core.serializers 或使用 django-rest-framework 序列化模型。我可以使用 json 库将 dict 与原始类型进行序列化,但我不知道如何将它们混合在一起的任何简单方法。

理想的方法是通过 locals 字典并用它们的序列化表示替换所有找到的模型,然后将它们放在一起,甚至可能在哪个序列化器(在 drf 意义上)用于哪个模型之前指定。但我真的不想重新发明***,以防它已经存在。

另一个问题是 - 尝试这样做是否是个好主意?返回 json 上下文作为服务器端渲染的替代方案?我正处于原型设计阶段,所以我仍在考虑如何向前推进,我们感谢该领域的任何意见。

【问题讨论】:

【参考方案1】:

我会推荐使用 DRF

ModelSerializer 将返回一个 Json 编码的模型数组 SerializerDictField 将返回一个 Json 编码的 dict SerializerListField 将返回一个 Json 编码的 list

您可以创建 Serializer 字段是另一个 Serializer 用于嵌套目的。

https://www.django-rest-framework.org/api-guide/fields/#composite-fields

https://www.django-rest-framework.org/api-guide/serializers/#dealing-with-nested-objects

对于你的问题,这是个好主意,我想说:

如果您将数据推送到外部源(不是 django),那很好 如果您将数据推送到 django 模板,这是个坏主意,您会失去很多 django 功能:(

【讨论】:

我知道这一点,但这需要我为每个视图创建序列化程序,即使我认为没有必要。在我看来,我需要做的就是为模型和其余部分(原始数据类型 + 列表/集合/字典)提供序列化程序。 会起作用,(但您需要提供好的 ModelSerializer)但每个视图都会像掷硬币一样。如果你想用 API 来构建它,你需要更严格,否则你会浪费很多时间来调试

以上是关于Django - 使用模型和数据序列化复杂的上下文结构的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework-----序列化详解(serializers)

使用 prefetch_related 和聚合来避免 Django 数据库查询具有时间序列数据的模型的 n+1 问题

序列化器 (Serializers)

序列化器 (Serializers)

无法在 Django Rest Framework 序列化程序的验证数据中获取非模型字段

Django:如何使用动态(非模型)数据预填充 FormView?