from typing import Any, Dict, List
from django.core.exceptions import FieldDoesNotExist
from django.db import models
def serialize_model(model: models.Model) -> Dict[str, Any]:
result = {
name: serialize_model(foreign_key)
for name, foreign_key in model.__dict__["_state"].__dict__.get("fields_cache", {}).items()
}
for name, value in model.__dict__.items():
try:
model._meta.get_field(name)
except FieldDoesNotExist:
continue
else:
result[name] = value
for name, queryset in model.__dict__.get("_prefetched_objects_cache", {}).items():
result[name] = serialize_queryset(queryset)
return result
def serialize_queryset(queryset: models.QuerySet) -> List[Dict[str, Any]]:
return [serialize_model(model) for model in queryset]
发 V2EX 上给各位大佬看就不写那么多前后文的废话了。直接根据 Django Model 存储设计进行序列化,不需要定义额外的模型,不需要担心 N+1 查询。在我博客《一种序列化 Django model 的新思路》可以看看前因后果。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.