上文设计了model类,为了方便后续数据的操作,与之对应的schema类也要相同的设计。
schema定义
modelschema.py
from marshmallow import Schema, fields
from model import Account, Event, Project, Host, Rule
class BaseSchema(Schema):
"""
基类结构
"""
id = fields.Int(dump_only=True, description="唯一标识符")
class AccoutnSchema(BaseSchema):
projects = fields.Nested("ProjectSchema", dump_only=True, exclude=['accounts'])
account_name = fields.Str(required=True, description="账号名称")
account_nickname = fields.Str(required=True, description="账号昵称")
dingding_id = fields.Str(required=True, description="钉钉ID")
mobile = fields.Str(required=True, description="手机号")
account_dept = fields.Str(required=True, description="部门")
# class AccountSchema(BaseSchema):
# """
#
# """
# projects = fields.Nested("ProjectSchema", many=True, dump_only=True, exclude=['accounts'])
#
# class Meta:
# model = Account
# fields = ('account_name', 'account_nickname',
# 'dingding_id', 'mobile', 'account_dept', 'projects')
class EventSchema(BaseSchema):
"""
"""
class Meta:
model = Event
fields = ('start_time', 'end_time', 'info', 'status', 'event_id')
class ProjectSchema(BaseSchema):
"""
项目信息
"""
accounts = fields.Nested("AccountSchema",many=True, dump_only=True, exclude=['projects'])
hosts = fields.Nested("HostSchema", many=True, dump_only=True, exclude=['project'])
class Meta:
model = Project
fields = ('project_name', 'project_webhook', 'hosts', 'accounts')
class HostSchema(BaseSchema):
"""
主机信息
"""
project = fields.Nested("ProjectSchema", dump_only=True, exclude=['hosts'])
class Meta:
model = Host
fields = ('ip', 'hostname', 'project')
class RuleSchema(BaseSchema):
"""
"""
class Meta:
model = Rule
fields = ('rule_name', 'rule_content')
这里用到了两种写法来定义schema
写法一
- 使用
Meta
类指定了AccountSchema
的元信息,包括模型和字段列表。 - 继承了
BaseSchema
,表明AccountSchema
是在基类结构上进行扩展的。 - 通过
projects
字段使用了嵌套的ProjectSchema
,并指定了一些参数
写法二
- 没有使用
Meta
类,字段直接定义在AccountSchema
中。 - 与
BaseSchema
继承相同,表明是在基类结构上进行扩展。 - 每个字段都在类中直接定义,没有使用元信息。
区别
在功能上,这两种写法的主要区别在于组织结构和代码的风格,而在使用上的神峨眉区别相对较小。使用上的主要区别包括:
- 字段定义:
- 写法一中,字段的定义集中在
Meta
类中。 - 写法二中,字段的定义直接在类中。
- 代码清晰度:
- 写法一使用了
Meta
类,可以将元信息集中在一个地方,使代码更加清晰。 - 写法二直接在类中定义字段,可能更加直观,但随着字段数量增多,可读性可能会下降。
- 扩展性:
- 写法一更容易扩展和维护,特别是在大型项目中,通过
Meta
类可以方便地添加其他元信息。 - 写法二适用于较小的结构,但随着类的增长,可能需要更多的重构来保持代码的清晰度。
总体而言,这两种写法在使用上的区别主要体现在代码的组织和可读性上。根据项目的规模和团队的偏好,选择适合自己团队和项目的方式即可。