跳转至

覆盖 Pydantic 配置

对于一个 Django Ninja Schema 模式, 有许多可用的自定义设置,通过模式的 Pydantic Config.

注意

在底层 Django Ninja 使用 Pydantic Models 模型 及其所有的特性和优点。 选择别名 Schema 是为了在代码中使用 Django 模型时避免混淆, 因为 Pydantic 的模型类默认被称为“模型”,与 Django 的“模型”类冲突。

示例驼峰命名模式

一个有趣的 Config 属性是 alias_generator 别名生成器. 在 Django Ninja 中使用 Pydantic 的示例可能看起来像这样:

from ninja import Schema


def to_camel(string: str) -> str:
    return ''.join(word.capitalize() for word in string.split('_'))


class CamelModelSchema(Schema):
    str_field_name: str
    float_field_name: float

    class Config(Schema.Config):
        alias_generator = to_camel

注意

当覆盖 schema 模式的 Config时,有必要从基础 Config 类继承。

请记住,当你想要修改字段名称的输出(如驼峰命名)时 - 你还需要设置 populate_by_nameby_alias

class UserSchema(ModelSchema):
    class Config:
        model = User
        model_fields = ["id", "email"]
        alias_generator = to_camel
        populate_by_name = True  # !!!!!! <--------


@api.get("/users", response=list[UserSchema], by_alias=True) # !!!!!! <-------- by_alias
def get_users(request):
    return User.objects.all()

结果:

[
  {
    "Id": 1,
    "Email": "tim@apple.com"
  },
  {
    "Id": 2,
    "Email": "sarah@smith.com"
  }
  ...
]

来自 Django 模型的自定义配置

当使用 create_schema时,生成的 模式可以用于构建另一个具有自定义配置的类,如:

from django.contrib.auth.models import User
from ninja.orm import create_schema


BaseUserSchema = create_schema(User)


class UserSchema(BaseUserSchema):

    class Config(BaseUserSchema.Config):
        ...

大功告成

继续下一章节! 分页

评论


本文总阅读量