完全指南:模型字段、校验逻辑与 API 实践)
后端网络数据建模【免费下载链接】netboxThe premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/products/free-netbox-cloud/项目地址https://gitcode.com/gh_mirrors/ne/netbox点击查看免费下载Rack Reservation机架预留是 NetBox 数据中心管理DCIM模块中的一项核心规划能力用于将机架Rack内的指定 U 位提前预留给未来将要部署的设备从而在装机前完成容量规划与资源占位。本文以官方模型文档 rackreservation.md 为骨架结合 racks.py 等源码实现系统讲解该模型的字段含义、U 位表达语法、校验规则、状态扩展、REST API 与过滤查询方式帮助你完整掌握预留这一工作流的建模与使用细节。机架预留的核心概念与适用场景在 NetBox 中机架预留Rack Reservation允许用户将某个机架内的任意一组 U 位标记为已预留供未来安装设备使用。其核心设计约束体现在官方文档的明确表述中一个预留记录可以关联任意多个不连续的 U 位但一条预留不能跨越多台机架——机架与预留是一对多的关系每次预留都绑定在单台机架上每条预留必须填写描述Description用于说明预留目的预留可以非必须关联某个租户Tenant用于在多租户场景下区分资源归属预留必须关联一个 NetBox 用户User用于记录是谁发起了预留。典型使用场景包括为即将到货的服务器规划上架位置、为项目立项保留一段机柜空间、在多团队共享机房的场景下提前占位避免冲突等。它与机架本身的建模见 rack.md配合使用——先有机架才能在机架上创建预留。模型字段详解从文档到源码以下字段定义与官方文档一一对应并在 netbox/dcim/models/racks.py 中给出实际实现Rack机架被预留的机架对象。在源码中定义为外键rack models.ForeignKey( todcim.Rack, on_deletemodels.CASCADE, related_namereservations )注意on_deletemodels.CASCADE当机架被删除时其下所有预留记录会随之级联删除。related_namereservations意味着可以通过rack.reservations反向查询某台机架上的全部预留。UnitsU 位集合被预留的一个或多个机架 U 位存储为PositiveSmallIntegerField的数组PostgreSQLArrayFieldunits ArrayField( verbose_name_(units), base_fieldmodels.PositiveSmallIntegerField() )U 位表达语法官方文档明确给出多个 U 位可以使用逗号和/或连字符组合表达。例如1—— 仅 U11,3—— U1 和 U3不连续的单个 U 位5-7—— U5、U6、U7连续的 U 位区间1,3,5-7—— U1、U3、U5、U6、U7混合表达。UI 表单会解析这种语法字符串并展开为数组存储模型侧提供了unit_list属性见 racks.py调用array_to_string(self.units)将数组反向格式化为1,3,5-7这样的可读字符串用于列表展示。Total Us总 U 位数这是一个计算型只读字段反映该预留共占用了多少个 U 位。其计算逻辑在 API 序列化器中实现见 serializers_/racks.pyunit_count serializers.SerializerMethodField() extend_schema_field(OpenApiTypes.INT32) def get_unit_count(self, obj): return len(obj.units)即unit_count len(obj.units)直接统计 units 数组的元素个数。该字段是只读的不能在创建或编辑时直接写入。但它可以作为过滤条件使用通过unit_count_min与unit_count_max参数在 UI 或 API 中按预留 U 位数量进行筛选详见下文过滤与查询一节。Status状态预留的当前状态源码中定义为status models.CharField( verbose_name_(status), max_length50, choicesRackReservationStatusChoices, defaultRackReservationStatusChoices.STATUS_ACTIVE )内置状态在 netbox/dcim/choices.py 的RackReservationStatusChoices中定义共三种状态值显示名称颜色描述pendingPendingcyan等待确认Awaiting confirmationactiveActivegreen当前生效Currently in effectstaleStaleorange不再有效或不再使用No longer valid or in use重要提醒官方文档原意状态仅用于文档记录/管理参考它对设备的实际安装没有任何影响——即状态为pending或stale的预留 U 位同样不会阻止设备被安装到该 U 位。是否允许安装由机架自身的容量与实际占用决定与预留状态无关。扩展自定义状态官方文档提示如需增加更多状态可在配置文件中通过FIELD_CHOICES参数覆盖RackReservation.status的选项集见>user models.ForeignKey( tosettings.AUTH_USER_MODEL, on_deletemodels.PROTECT )on_deletemodels.PROTECT意味着只要某用户还持有预留记录该用户就不能被直接删除从而保证历史数据完整。官方文档特别说明拥有足够权限的用户可以为其他用户创建机架预留——即在创建预留的表单或 API 中user字段并非强制等于当前登录用户而是可指定任意有权限的用户。Description描述每条机架预留必须包含用途描述源码定义为必填字段description models.CharField( verbose_name_(description), max_length200 )最大长度为 200 字符这是除关联字段外的强制填写项用于说明为什么预留这些 U 位。Tenant租户可选预留可关联租户可选、可空外键使用on_deletemodels.PROTECT即存在关联预留时租户不可删除。在多租户环境中可用它标注预留归属的业务方。预留校验逻辑源码级解析RackReservation.clean()方法racks.py实现了创建/编辑时的两道核心校验理解它们有助于避免在实际使用中踩坑校验 1U 位必须在机架范围内invalid_units [u for u in self.units if u not in self.rack.units] if invalid_units: raise ValidationError({ units: _(Invalid unit(s) for {height}U rack: {unit_list}).format(...) })即提交的每个 U 位必须落在该机架的 U 位集合内不能预留超出机架总高度如 42U 机架的 U 位错误信息会明确列出非法 U 位与机架高度。校验 2U 位不能被同机架的其他预留重复占用reserved_units [] for resv in self.rack.reservations.exclude(pkself.pk): reserved_units resv.units conflicting_units [u for u in self.units if u in reserved_units] if conflicting_units: raise ValidationError({ units: _(The following units have already been reserved: {unit_list}).format(...) })系统会遍历该机架上除自身以外的所有预留汇总已占用 U 位一旦本次预留与其重叠即抛出以下 U 位已被预留的错误。注意该校验仅针对预留之间的冲突如前所述预留状态与设备安装互不影响预留 U 位中安装设备是允许的。其他值得注意的模型细节clone_fields (rack, user, tenant)NetBox UI 提供复制功能时会沿用机架、用户、租户字段便于快速创建多条类似预留Meta.ordering [created, pk]预留默认按创建时间排序to_objectchange()将变更记录ObjectChange的关联对象设为self.rack因此预留的增删改会以机架为关联对象记录在变更日志中见 racks.py。通过 REST API 使用机架预留机架预留的 REST API 端点位于/api/dcim/rack-reservations/序列化器定义见 netbox/dcim/api/serializers_/racks.py完整字段如下id, url, display_url, display, rack, units, unit_count, status, created, last_updated, user, tenant, description, owner, comments, tags, custom_fields关键字段说明rack、user、tenant均以嵌套序列化器返回status使用ChoiceFieldchoices 来自RackReservationStatusChoicesrequiredFalse不传时使用默认值activeunit_count为只读计算字段见上文简要列表brief仅返回id, url, display, status, user, description, units从源码可见该模型还支持owner所有者、comments备注、tags标签、custom_fields自定义字段等 NetBox 通用字段。创建预留示例POST /api/dcim/rack-reservations/{ rack: 12, units: [1, 3, 5, 6, 7], user: 1, status: active, description: Reserved for Q3 database cluster deployment, tenant: 3 }其中units直接以整数数组提交对应1,3,5-7的展开结果。若提交的 U 位超出机架范围或与其他预留冲突API 将返回 400 及对应的units字段校验错误。过滤与查询UI 与 API 通用RackReservationFilterSetnetbox/dcim/filtersets.py为该模型提供了丰富的过滤维度UI 列表页与 REST API 的?查询参数共用这套过滤集直接关联过滤rack_id/rack——按机架过滤status——按状态过滤取值pending、active、staleuser_id/user——按用户ID 或用户名过滤tenant——按租户过滤继承自TenancyFilterSet。按机架层级定位过滤通过rack__关联字段跨越查询site_id/site站点、region_id/region区域、site_group_id/site_group站点组、location_id/location位置、group_id/group机架组。这让运维人员可以直接在某个站点/区域下看有哪些预留不必先查出机架再逐台查看。按 U 位与数量过滤官方文档重点提及unit——使用NumericArrayFilter基于field_nameunits、lookup_exprcontains即查询包含指定 U 位的预留如?unit5找出所有预留了 U5 的记录unit_count_min——unit_count字段过滤只显示 U 位总数不小于该值的预留unit_count_max——unit_count字段过滤只显示 U 位总数不大于该值的预留。例如要找出所有预留了至少 5 个 U 位且当前生效的预留可以组合查询?unit_count_min5statusactive。预留与机架 U 位占用、设备安装的关系理解机架预留最关键的是分清三类占用概念预留Rack Reservation仅表达未来计划使用这些 U 位属于规划层数据状态纯属文档标记不影响设备安装判定实际安装Devices设备模型通过device.rack与device.position起始 U 位记录真实上架位置这是机架容量计算与 U 位占用判定的真实依据变更日志预留的创建/修改/删除会以机架为关联对象写入 ObjectChange可在机架详情页的变更历史中追溯。因此一个 U 位可以已被预留但尚未安装设备也可以已安装设备但从未创建预留二者互不阻塞。建议的运维实践是在规划阶段用预留占位在设备实际上架时同步创建设备记录并将预留状态从pending更新为active或stale以保持规划数据与实际状态一致。相关资源导航官方模型文档rackreservation.md本文的原始依据机架模型rack.md模型实现netbox/dcim/models/racks.py状态定义netbox/dcim/choices.py过滤集实现netbox/dcim/filtersets.pyAPI 序列化器netbox/dcim/api/serializers_/racks.py表单实现model_forms.py创建/编辑表单、bulk_import.py批量导入、bulk_edit.py批量编辑列表表格netbox/dcim/tables/racks.py视图与 API 端点netbox/dcim/views.py、netbox/dcim/api/views.pyGraphQL 支持netbox/dcim/graphql/types.py、netbox/dcim/graphql/filters.py测试用例test_views.py、test_api.py、test_filtersets.py覆盖上述校验与过滤逻辑扩展自定义状态字段见>赞分享后端网络数据建模【免费下载链接】netboxThe premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/products/free-netbox-cloud/项目地址https://gitcode.com/gh_mirrors/ne/netbox点击查看免费下载相关推荐NetBox API Token 完全指南v1/v2 双版本机制、字段详解与安全实践NetBox API Token 完全指南v1/v2 双版本机制、字段详解与安全实践 API Token 是 NetBox 中连接用户与 REST/Graph后端网络数据建模nautilus_trader 期货合约建模指南FuturesContract 字段体系、校验逻辑与双语言构造实践nautilus_trader 期货合约建模指南 FuturesContract 字段体系、校验逻辑与双语言构造实践 FuturesContract 是 na金融科技后端NetBox Circuit 模型全解析运营商物理线路的建模字段、状态机与数据校验NetBox Circuit 模型全解析运营商物理线路的建模字段、状态机与数据校验 本文围绕 NetBox 的 Circuits线路模块核心数据模型 Ci后端网络数据建模创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考