上文设计了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类可以方便地添加其他元信息。 - 写法二适用于较小的结构,但随着类的增长,可能需要更多的重构来保持代码的清晰度。
 
总体而言,这两种写法在使用上的区别主要体现在代码的组织和可读性上。根据项目的规模和团队的偏好,选择适合自己团队和项目的方式即可。










