如何在Django-Ninja的Pydantic Schema中实现DRF的source="*"功能?
在Django-Ninja中实现DRF
source="*" 等价功能 要在Django-Ninja的Pydantic Schema中实现DRF里source="*"(将完整模型实例传递给嵌套序列化器)的效果,无需手动构造字典,可通过以下两种方式实现:
方式1:重写from_orm方法
直接在父Schema中重写from_orm方法,将整个模型实例传入嵌套Schema:
from ninja import Schema from .models import Author, Blog # 对应原DRF的BlogBaseSerializer class BlogBaseSchema(Schema): id: int name: str # 对应Author模型的字段 # 添加需要从Author实例序列化的其他字段 # 对应原DRF的AuthorSerializer class AuthorSchema(Schema): id: int name: str blog: BlogBaseSchema @classmethod def from_orm(cls, obj: Author) -> "AuthorSchema": # 将整个Author实例传入BlogBaseSchema完成序列化 return cls( id=obj.id, name=obj.name, blog=BlogBaseSchema.from_orm(obj) )
方式2:使用Pydantic模型验证器
通过model_validator在Schema解析阶段自动将模型实例赋值给嵌套字段:
from ninja import Schema from pydantic import model_validator from .models import Author, Blog class BlogBaseSchema(Schema): id: int name: str # 其他需要的字段 class AuthorSchema(Schema): id: int name: str blog: BlogBaseSchema @model_validator(mode="before") def populate_blog(cls, values): # 若传入的是Author模型实例,直接将其赋值给blog字段 if isinstance(values, Author): values["blog"] = values return values
效果说明
以上两种方式均能实现和DRF中source="*"完全一致的效果:将整个Author模型实例传递给BlogBaseSchema,自动序列化生成嵌套结构,无需手动拼接字典或列表,完美兼容原有客户端的API结构。
内容的提问来源于stack exchange,提问作者Khan Asfi Reza
相关产品推荐
相关产品推荐

