0
点赞
收藏
分享

微信扫一扫

从零开始构建报警中心:part07 报警中心功能设计02-Schema设计

千行 2023-12-18 阅读 37

上文设计了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

写法一

  1. 使用Meta类指定了AccountSchema的元信息,包括模型和字段列表。
  2. 继承了BaseSchema,表明AccountSchema是在基类结构上进行扩展的。
  3. 通过projects字段使用了嵌套的ProjectSchema,并指定了一些参数

写法二

  1. 没有使用Meta类,字段直接定义在AccountSchema中。
  2. BaseSchema继承相同,表明是在基类结构上进行扩展。
  3. 每个字段都在类中直接定义,没有使用元信息。

区别

在功能上,这两种写法的主要区别在于组织结构和代码的风格,而在使用上的神峨眉区别相对较小。使用上的主要区别包括:


  1. 字段定义:
  • 写法一中,字段的定义集中在Meta类中。
  • 写法二中,字段的定义直接在类中。
  1. 代码清晰度:
  • 写法一使用了Meta类,可以将元信息集中在一个地方,使代码更加清晰。
  • 写法二直接在类中定义字段,可能更加直观,但随着字段数量增多,可读性可能会下降。
  1. 扩展性:
  • 写法一更容易扩展和维护,特别是在大型项目中,通过Meta类可以方便地添加其他元信息。
  • 写法二适用于较小的结构,但随着类的增长,可能需要更多的重构来保持代码的清晰度。

总体而言,这两种写法在使用上的区别主要体现在代码的组织和可读性上。根据项目的规模和团队的偏好,选择适合自己团队和项目的方式即可。

举报

相关推荐

0 条评论