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/netbox
Rack Type(机架类型)是 NetBox 中描述某一种具体型号机架物理特性的模型,它把"制造厂商 + 型号"对应的外形、宽度、高度、承重、散热等规格沉淀为可复用的标准定义。本文基于官方模型文档并对照仓库源码,完整讲解 Rack Type 的每一个字段、底层模型实现、校验逻辑,以及它如何通过属性继承机制驱动具体机架(Rack)的物理参数,帮助你正确建模数据中心资产。
什么是 Rack Type
Rack Type 定义了一种特定型号 rack(机架) 的物理特性。在现实中,同一厂商同一型号的机架(例如某品牌 42U 四柱机柜)具有完全一致的宽度、高度、安装深度和承重能力。与其在每一台机架上重复录入这些规格,NetBox 允许你先定义一个 Rack Type,再把具体的机架关联到该类型上,从而:
- 统一管理同型号机架的物理规格,避免逐台手工录入与数据不一致;
- 在创建机架时自动继承类型定义的物理属性;
- 按厂商、型号、形态因素等维度统计和筛选机架。
从源码看,RackType 模型 定义在netbox/dcim/models/racks.py中,它继承自抽象的RackBase基类,并实现了ImageAttachmentsMixin(支持附加图片)与WeightMixin(重量字段混入)。其默认排序为('manufacturer', 'model'),即按厂商、型号排序展示。
核心字段详解
Rack Type 的字段可以分为「标识字段」与「物理特性字段」两部分。物理特性字段大多定义在抽象基类RackBase(netbox/dcim/models/racks.py)中,机架(Rack)模型同样继承该基类,因此两者共享同一套物理属性定义。
Manufacturer(厂商)
产生该型号机架的 manufacturer(厂商)。在源码中这是一个外键:
manufacturer = models.ForeignKey( to='dcim.Manufacturer', on_delete=models.PROTECT, related_name='rack_types' )需要注意on_delete=models.PROTECT:当有 Rack Type 引用某厂商时,该厂商记录无法被直接删除,这保证了资产数据的引用完整性。related_name='rack_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_source='model')实现:当用户未手动填写 slug 时,系统会依据「型号」字段自动生成,简化录入。
Form Factor(形态因素)
机架的类型形态,可选项如下(定义于 RackFormFactorChoices):
| 值(slug) | 显示名称 | 含义 |
|---|---|---|
2-post-frame | 2-post frame | 开放式双柱继电器架 |
4-post-frame | 4-post frame | 开放式四柱机架 |
4-post-cabinet | 4-post cabinet | 封闭式四柱机柜 |
wall-frame | Wall-mounted frame | 壁挂式开放式机架 |
wall-frame-vertical | Wall-mounted frame (vertical) | 壁挂式(垂直导轨方向)开放式机架 |
wall-cabinet | Wall-mounted cabinet | 壁挂式封闭机柜 |
wall-cabinet-vertical | Wall-mounted cabinet (vertical) | 壁挂式(垂直导轨方向)封闭机柜 |
形态因素是 Rack Type 上必填的字段(blank=False且无默认值)。这一点与机架模型不同:机架上的form_factor允许为空(因为可由 Rack Type 继承),RackTypeSerializer 中对此有明确注释说明。
Width(宽度)
机架正面两条垂直导轨之间的标准距离,单位为英寸。默认值为 19 英寸,可选值定义于 RackWidthChoices:
| 值 | 含义 |
|---|---|
10 | 10 英寸 |
19 | 19 英寸(默认) |
21 | 21 英寸 |
23 | 23 英寸 |
Height(高度,U 数)
机架高度,以机架单位(rack unit, U)计量。字段名为u_height,默认 42U,校验范围为 1 到 100U:
u_height = models.PositiveSmallIntegerField( default=RACK_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,并校验最小值不小于 1:
starting_unit = models.PositiveSmallIntegerField( default=RACK_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,保证数据自洽。RackDimensionUnitChoices(netbox/dcim/choices.py)仅提供mm(毫米)与in(英寸)两种单位。
Mounting Depth(安装深度)
机架能容纳的已安装设备的最大深度,单位为毫米。对于四柱机架或机柜,该值等于前、后垂直导轨之间的水平距离。注意该测量值不包含导轨与柜门之间的空间。字段本身允许为空:
mounting_depth = models.PositiveSmallIntegerField( blank=True, null=True, 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 磅)。重量相关字段由WeightMixin(netbox/netbox/models/mixins.py)提供:
weight:DecimalField,最大 8 位数字、2 位小数,可选;weight_unit:重量单位,可选;_abs_weight:保存时自动将重量换算为克的整数字段,用于数据库层面的重量排序与汇总。
Maximum Weight(最大承重)
所有已安装设备的总重量上限,包含机架自身重量。源码在保存时会调用to_grams()将其归一化为克存入_abs_max_weight,用于排序与校验。与外部尺寸类似,填写了max_weight就必须同时指定weight_unit:
if 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() # 冷却能力颜色 RackType(ImageAttachmentsMixin, RackBase) ├── form_factor(必填)/ manufacturer(PROTECT 外键)/ model / slug ├── rack_count(CounterCacheField 计数器缓存) └── clone_fields / prerequisite_models Rack(ContactsMixin, 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)将字段组织为清晰的字段集(FieldSet):
- Rack Type:manufacturer(厂商,支持
quick_add快速新建)、model、slug(自动生成)、description、form_factor、tags; - Dimensions(尺寸):width、u_height,以及成组的内联字段 outer_width / outer_height / outer_depth / outer_unit(外部尺寸)、weight / max_weight / weight_unit(重量)、mounting_depth;
- Numbering(编号):starting_unit、desc_units;
- Cooling(冷却):cooling_capability、cooling_capacity。
厂商字段使用DynamicModelChoiceField,并开启quick_add=True,意味着在创建机架类型时若厂商尚不存在,可直接在弹出的对话框中即时创建,减少来回切换。
通过 REST API 管理 Rack Type
Rack Type 的 REST API 端点为/api/dcim/rack-types/(路由注册见 netbox/dcim/api/urls.py),由RackTypeViewSet(netbox/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。
创建示例(需先具备对应权限与已存在的厂商 ID):
POST /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 过滤
RackTypeFilterSet(netbox/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__icontains=value) | Q(description__icontains=value) | Q(comments__icontains=value) )例如查找所有 APC 厂商的 42U 封闭机柜:
GET /api/dcim/rack-types/?manufacturer=apc&form_factor=4-post-cabinet&u_height=42GraphQL 查询
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 Type,NetBox 可以成为数据中心机架与设备规格的单一可信源(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),仅供参考