NetBox Rack Type(机架类型)模型完全指南:字段定义、源码实现与属性继承机制

📅 发布时间:2026/9/20 11:24:21
NetBox Rack Type(机架类型)模型完全指南:字段定义、源码实现与属性继承机制
NetBox Rack Type机架类型模型完全指南字段定义、源码实现与属性继承机制【免费下载链接】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/netboxRack Type机架类型是 NetBox 中描述某一种具体型号机架物理特性的模型它把制造厂商 型号对应的外形、宽度、高度、承重、散热等规格沉淀为可复用的标准定义。本文基于官方模型文档并对照仓库源码完整讲解 Rack Type 的每一个字段、底层模型实现、校验逻辑以及它如何通过属性继承机制驱动具体机架Rack的物理参数帮助你正确建模数据中心资产。什么是 Rack TypeRack Type 定义了一种特定型号 rack机架 的物理特性。在现实中同一厂商同一型号的机架例如某品牌 42U 四柱机柜具有完全一致的宽度、高度、安装深度和承重能力。与其在每一台机架上重复录入这些规格NetBox 允许你先定义一个 Rack Type再把具体的机架关联到该类型上从而统一管理同型号机架的物理规格避免逐台手工录入与数据不一致在创建机架时自动继承类型定义的物理属性按厂商、型号、形态因素等维度统计和筛选机架。从源码看RackType 模型 定义在netbox/dcim/models/racks.py中它继承自抽象的RackBase基类并实现了ImageAttachmentsMixin支持附加图片与WeightMixin重量字段混入。其默认排序为(manufacturer, model)即按厂商、型号排序展示。核心字段详解Rack Type 的字段可以分为「标识字段」与「物理特性字段」两部分。物理特性字段大多定义在抽象基类RackBasenetbox/dcim/models/racks.py中机架Rack模型同样继承该基类因此两者共享同一套物理属性定义。Manufacturer厂商产生该型号机架的 manufacturer厂商。在源码中这是一个外键manufacturer models.ForeignKey( todcim.Manufacturer, on_deletemodels.PROTECT, related_namerack_types )需要注意on_deletemodels.PROTECT当有 Rack Type 引用某厂商时该厂商记录无法被直接删除这保证了资产数据的引用完整性。related_namerack_types意味着可以通过manufacturer.rack_types反向查询该厂商的所有机架类型。Model型号厂商分配给该机架类型的型号编号必填最大长度 100 字符。源码在Meta中通过数据库唯一约束保证「同一厂商下型号唯一」constraints ( models.UniqueConstraint( fields(manufacturer, model), name%(app_label)s_%(class)s_unique_manufacturer_model ), ... )同时模型提供了full_name属性返回{manufacturer} {model}的组合名称如 APC AR3100__str__则直接返回model字段值。Slug型号标识的 URL 友好唯一表示最大长度 100 字符。它既可以用于过滤REST API 与过滤表单均支持按 slug 精确匹配也在Meta中被约束为「同一厂商下 slug 唯一」models.UniqueConstraint( fields(manufacturer, slug), name%(app_label)s_%(class)s_unique_manufacturer_slug )在 RackTypeForm 中slug 字段通过SlugField(slug_sourcemodel)实现当用户未手动填写 slug 时系统会依据「型号」字段自动生成简化录入。Form Factor形态因素机架的类型形态可选项如下定义于 RackFormFactorChoices值slug显示名称含义2-post-frame2-post frame开放式双柱继电器架4-post-frame4-post frame开放式四柱机架4-post-cabinet4-post cabinet封闭式四柱机柜wall-frameWall-mounted frame壁挂式开放式机架wall-frame-verticalWall-mounted frame (vertical)壁挂式垂直导轨方向开放式机架wall-cabinetWall-mounted cabinet壁挂式封闭机柜wall-cabinet-verticalWall-mounted cabinet (vertical)壁挂式垂直导轨方向封闭机柜形态因素是 Rack Type 上必填的字段blankFalse且无默认值。这一点与机架模型不同机架上的form_factor允许为空因为可由 Rack Type 继承RackTypeSerializer 中对此有明确注释说明。Width宽度机架正面两条垂直导轨之间的标准距离单位为英寸。默认值为 19 英寸可选值定义于 RackWidthChoices值含义1010 英寸1919 英寸默认2121 英寸2323 英寸Height高度U 数机架高度以机架单位rack unit, U计量。字段名为u_height默认 42U校验范围为 1 到 100Uu_height models.PositiveSmallIntegerField( defaultRACK_U_HEIGHT_DEFAULT, # 42 validators[MinValueValidator(1), MaxValueValidator(RACK_U_HEIGHT_MAX)], # 上限 100 help_text_(Height in rack units) )常量RACK_U_HEIGHT_DEFAULT与RACK_U_HEIGHT_MAX定义于 netbox/dcim/constants.py。Starting Unit起始单元机架中编号最低的单元编号默认值为 1。在某些场景下可以设置更高的起始值例如只建模共享物理机架中的某一指定单元区间如 U13 到 U24。源码默认值来自RACK_STARTING_UNIT_DEFAULT 1并校验最小值不小于 1starting_unit models.PositiveSmallIntegerField( defaultRACK_STARTING_UNIT_DEFAULT, validators[MinValueValidator(1)], )Outer Dimensions外部尺寸机架的外部宽、高、深用于辅助机房平面布局floorplan计算。这三个字段均可选且必须配套指定单位毫米mm或英寸in。如果只填了尺寸而没填单位clean()校验会直接报错if any([self.outer_width, self.outer_depth, self.outer_height]) and not self.outer_unit: raise ValidationError(_(Must specify a unit when setting an outer dimension))反之save()中若三个外部尺寸均未设置则会自动清空outer_unit保证数据自洽。RackDimensionUnitChoicesnetbox/dcim/choices.py仅提供mm毫米与in英寸两种单位。Mounting Depth安装深度机架能容纳的已安装设备的最大深度单位为毫米。对于四柱机架或机柜该值等于前、后垂直导轨之间的水平距离。注意该测量值不包含导轨与柜门之间的空间。字段本身允许为空mounting_depth models.PositiveSmallIntegerField( blankTrue, nullTrue, help_text_(Maximum depth of a mounted device, in millimeters. For four-post racks, this is the distance between the front and rear rails.) )Weight重量机架自身的重量包含重量单位如 10 公斤或 20 磅。重量相关字段由WeightMixinnetbox/netbox/models/mixins.py提供weightDecimalField最大 8 位数字、2 位小数可选weight_unit重量单位可选_abs_weight保存时自动将重量换算为克的整数字段用于数据库层面的重量排序与汇总。Maximum Weight最大承重所有已安装设备的总重量上限包含机架自身重量。源码在保存时会调用to_grams()将其归一化为克存入_abs_max_weight用于排序与校验。与外部尺寸类似填写了max_weight就必须同时指定weight_unitif self.max_weight and not self.weight_unit: raise ValidationError(_(Must specify a unit when setting a maximum weight))Cooling Capability冷却能力与 Cooling Capacity冷却容量这两个字段描述机架设计的散热规格属于较新的能力NetBox 4.x 引入冷却模型后的配套字段冷却能力air-only仅风冷不输送冷却液、hybrid混合可接入冷却液也支持风冷设备、liquid-only仅液冷面向直接芯片冷却或浸没式系统。选项定义于 RackCoolingCapabilityChoices并附带颜色标识风冷-青、混合-蓝、液冷-紫。冷却容量以千瓦kW为单位DecimalField支持 10 位数字、2 位小数取值不小于 0。这两项为机架级字段Rack.cooling_capability/Rack.cooling_capacity提供了设计基准具体的冷却设备接入如冷却馈线 cooling feed请参阅 冷却功能文档。Descending Units单元倒序编号若勾选该选项机架立面图将把 U1 显示在机架顶部。大多数机架采用升序编号U1 在底部。源码中该布尔字段默认False并通过units属性生成从上到下的单元编号列表property def units(self): if self.desc_units: return drange(decimal.Decimal(self.starting_unit), self.u_height self.starting_unit, 0.5) return drange(self.u_height decimal.Decimal(0.5) self.starting_unit - 1, 0.5 self.starting_unit - 1, -0.5)注意列表以 0.5 为步长生成这为半高0.5U设备预留了建模空间。源码级实现模型结构与继承体系从源码结构看Rack Type 的实现体现了清晰的复用设计RackBase抽象基类netbox/dcim/models/racks.py#L58-L161 ├── width / u_height / starting_unit / desc_units # 宽度与编号 ├── outer_width / outer_height / outer_depth / outer_unit # 外部尺寸 ├── mounting_depth # 安装深度 ├── max_weight / _abs_max_weight # 最大承重含克归一化 ├── cooling_capability / cooling_capacity # 冷却规格 └── get_cooling_capability_color() # 冷却能力颜色 RackTypeImageAttachmentsMixin, RackBase ├── form_factor必填/ manufacturerPROTECT 外键/ model / slug ├── rack_countCounterCacheField 计数器缓存 └── clone_fields / prerequisite_models RackContactsMixin, ImageAttachmentsMixin, TrackingModelMixin, RackBase └── rack_type 外键 copy_racktype_attrs() 属性继承RackBase是抽象基类因此机架类型与机架共享同一套物理字段定义避免了两处重复维护。RackType的clone_fields可克隆字段覆盖了除model/slug外的全部物理属性便于在 UI 中一键克隆出同规格的不同型号prerequisite_models (dcim.Manufacturer,)则声明了创建机架类型前必须先存在厂商。rack_count是一个CounterCacheField计数器缓存字段由 NetBox 的计数器同步机制netbox/dcim/apps.py 中connect_counters(...)自动维护用于实时显示该类型下已关联的机架数量避免频繁 COUNT 查询。Rack Type 与 Rack 的属性继承机制这是 Rack Type 最核心的工程价值机架从其所分配的机架类型继承物理属性。在 Rack 模型 中定义了一组RACKTYPE_FIELDS列出所有可以由类型继承的字段形态因素、宽度、U 高、起始单元、倒序、外部尺寸、安装深度、重量、最大承重、冷却能力、冷却容量。copy_racktype_attrs()方法在机架每次保存时执行def copy_racktype_attrs(self): if self.rack_type: for field_name in self.RACKTYPE_FIELDS: setattr(self, field_name, getattr(self.rack_type, field_name))即只要机架关联了 Rack Type其物理属性一律以类型为准覆盖本地值。而当Rack Type 被修改保存时save() 方法 会遍历所有关联机架先snapshot()写入变更记录再重新复制属性for rack in self.racks.all(): rack.snapshot() rack.copy_racktype_attrs() rack.save()这意味着调整型号规格后全站同型号机架会同步更新且每次更新都会留下可审计的变更日志方便追溯。需要注意的是rack 文档 中已明确提示NetBox v5.0 起机架上的形态因素、宽度、外部尺寸等字段将被弃用Rack Type 的分配将成为强制项这些物理属性将一律从类型推断。因此新项目中强烈建议尽早把所有物理规格定义在 Rack Type 上而不是直接写在机架记录里。U 高、起始单元、倒序编号与安装深度仍保留在机架模型上因为同型号的个体机架在这些参数上可能合理存在差异。表单录入体验在 UI 中Rack Type 的创建/编辑表单RackTypeForm将字段组织为清晰的字段集FieldSetRack Typemanufacturer厂商支持quick_add快速新建、model、slug自动生成、description、form_factor、tagsDimensions尺寸width、u_height以及成组的内联字段 outer_width / outer_height / outer_depth / outer_unit外部尺寸、weight / max_weight / weight_unit重量、mounting_depthNumbering编号starting_unit、desc_unitsCooling冷却cooling_capability、cooling_capacity。厂商字段使用DynamicModelChoiceField并开启quick_addTrue意味着在创建机架类型时若厂商尚不存在可直接在弹出的对话框中即时创建减少来回切换。通过 REST API 管理 Rack TypeRack Type 的 REST API 端点为/api/dcim/rack-types/路由注册见 netbox/dcim/api/urls.py由RackTypeViewSetnetbox/dcim/api/views.py提供标准的增删改查能力。RackTypeSerializer 暴露的完整字段包括id、url、display、manufacturer嵌套序列化、model、slug、description、form_factor、width、u_height、starting_unit、desc_units、outer_width、outer_height、outer_depth、outer_unit、weight、max_weight、weight_unit、mounting_depth、cooling_capability、cooling_capacity、owner、comments、tags、custom_fields、created、last_updated以及只读的rack_count计数。列表接口的 brief 模式则精简为id、url、display、manufacturer、model、slug、description、rack_count。创建示例需先具备对应权限与已存在的厂商 IDPOST /api/dcim/rack-types/ { manufacturer: 1, model: AR3100, slug: ar3100, form_factor: 4-post-cabinet, width: 19, u_height: 42, starting_unit: 1, desc_units: false, outer_unit: mm, outer_width: 600, outer_height: 1991, outer_depth: 1070, mounting_depth: 900, weight: 105.5, weight_unit: kg, max_weight: 1000, cooling_capability: air-only, cooling_capacity: 12.5 }提示填写outer_width/outer_height/outer_depth时必须同时提供outer_unit填写max_weight时必须提供weight_unit否则序列化校验会返回 400 错误——这与模型层clean()的规则一致。过滤与查询REST API 过滤RackTypeFilterSetnetbox/dcim/filtersets.py支持以下过滤维度关联字段manufacturer_id厂商 ID、manufacturer厂商 slug枚举字段form_factor、width、cooling_capability均支持多选普通字段id、model、slug、u_height、starting_unit、desc_units、outer_width、outer_height、outer_depth、outer_unit、mounting_depth、weight、max_weight、weight_unit、cooling_capacity、description计数器rack_count可据此筛选关联机架数量。search方法支持全文模糊检索命中范围为model、description与comments三个字段return queryset.filter( Q(model__icontainsvalue) | Q(description__icontainsvalue) | Q(comments__icontainsvalue) )例如查找所有 APC 厂商的 42U 封闭机柜GET /api/dcim/rack-types/?manufacturerapcform_factor4-post-cabinetu_height42GraphQL 查询Rack Type 同样暴露于 GraphQL API见 netbox/dcim/graphql/types.py类型名为RackTypeType并注册了对应的过滤器RackTypeFilter见 netbox/dcim/graphql/filters.py。在 schema.py 中可查询rack_type/rack_type_list顶层入口。一个示例查询query { rack_type_list(manufacturer: [apc], form_factor: [4-post-cabinet]) { id manufacturer { name } model slug u_height width cooling_capability cooling_capacity rack_count } }与其他模型的协作关系Manufacturer厂商Rack Type 的必选外键采用PROTECT保护删除Rack机架Rack Type 是机架的可选外键v5.0 起将成为必填机架通过copy_racktype_attrs()继承物理属性Rack Type 的修改会级联同步到所有关联机架冷却模型cooling_capability/cooling_capacity定义了机架设计的散热规格具体冷却液输送通过 coolingfeed冷却馈线 等对象落地相关功能整体介绍见 冷却功能文档。最佳实践小结把物理规格定义在 Rack Type 上NetBox 正在推动机架模型上形态因素、宽度、外部尺寸等字段的弃用v5.0尽早为每种型号建立 Rack Type 并分配给机架可以避免未来的迁移成本。善用属性继承同一型号机架只需维护一份规格修改类型后所有机架自动同步并产生变更日志避免手工逐台更新。善用过滤与搜索通过 REST API 的manufacturer、form_factor、width、cooling_capability等维度组合筛选可快速定位某种规格的机架型号。注意必填/联动校验外部尺寸与单位、最大承重与重量单位必须成对填写API 与 UI 表单均强制此规则。通过合理建模 Rack TypeNetBox 可以成为数据中心机架与设备规格的单一可信源source of truth为后续的容量规划、布局计算与自动化运维提供准确一致的物理数据基础。【免费下载链接】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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考