跳转至

从 Django models 中生成 Schema

Schemas 模式对于定义验证规则和响应非常有用,但有时您需要将数据库模型反映到模式中并保持更改同步。

ModelSchema 模型模式

ModelSchema 是一个特殊的基类,可以自动从您的模型生成模式。

您所需要做的就是在您的模式 Meta 上设置 modelfields:

from django.contrib.auth.models import User
from ninja import ModelSchema

class UserSchema(ModelSchema):
    class Meta:
        model = User
        fields = ['id', 'username', 'first_name', 'last_name']

# Will create schema like this:
# 
# class UserSchema(Schema):
#     id: int
#     username: str
#     first_name: str
#     last_name: str

使用所有模型字段

要使用模型的所有字段 - 您可以将 __all__ 传递给 fields:

class UserSchema(ModelSchema):
    class Meta:
        model = User
        fields = "__all__"

警告

不建议使用 all
这可能导致意外的不必要数据暴露(例如上述示例中的哈希密码)。
一般建议 - 使用 fields 明确定义您希望在 API 中可见的字段列表。

排除模型字段

要使用 少数几个之外的所有字段,您可以使用 exclude 配置:

class UserSchema(ModelSchema):
    class Meta:
        model = User
        exclude = ['password', 'last_login', 'user_permissions']

# Will create schema like this:
# 
# class UserSchema(Schema):
#     id: int
#     username: str
#     first_name: str
#     last_name: str
#     email: str
#     is_superuser: bool
#     ... and the rest

覆盖字段

要更改某些字段的默认注释,或添加新字段,只需像往常一样使用带注释的属性。

class GroupSchema(ModelSchema):
    class Meta:
        model = Group
        fields = ['id', 'name']


class UserSchema(ModelSchema):
    groups: List[GroupSchema] = []

    class Meta:
        model = User
        fields = ['id', 'username', 'first_name', 'last_name']

使字段可选

对于 PATCH API 操作,通常您需要使模式的所有字段可选。为此,您可以使用配置 fields_optional

class PatchGroupSchema(ModelSchema):
    class Meta:
        model = Group
        fields = ['id', 'name', 'description'] # Note: all these fields are required on model level
        fields_optional = '__all__'

您也可以只定义几个可选字段而不是所有:

     fields_optional = ['description']

大功告成

继续下一章节! 动态生成 Schema

评论


本文总阅读量