You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 12:03:35