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 的新思路》可以看看前因后果。