NetBox Rack Type(机架类型)模型完全指南:字段定义、源码实现与属性继承机制
2026/9/20 11:24:19 网站建设 项目流程

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-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 上必填的字段(blank=False且无默认值)。这一点与机架模型不同:机架上的form_factor允许为空(因为可由 Rack Type 继承),RackTypeSerializer 中对此有明确注释说明。

Width(宽度)

机架正面两条垂直导轨之间的标准距离,单位为英寸。默认值为 19 英寸,可选值定义于 RackWidthChoices:

含义
1010 英寸
1919 英寸(默认)
2121 英寸
2323 英寸

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_DEFAULTRACK_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)提供:

  • weightDecimalField,最大 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是抽象基类,因此机架类型与机架共享同一套物理字段定义,避免了两处重复维护。RackTypeclone_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 暴露的完整字段包括:idurldisplaymanufacturer(嵌套序列化)、modelslugdescriptionform_factorwidthu_heightstarting_unitdesc_unitsouter_widthouter_heightouter_depthouter_unitweightmax_weightweight_unitmounting_depthcooling_capabilitycooling_capacityownercommentstagscustom_fieldscreatedlast_updated,以及只读的rack_count计数。列表接口的 brief 模式则精简为idurldisplaymanufacturermodelslugdescriptionrack_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_factorwidthcooling_capability(均支持多选);
  • 普通字段idmodelslugu_heightstarting_unitdesc_unitsouter_widthouter_heightouter_depthouter_unitmounting_depthweightmax_weightweight_unitcooling_capacitydescription
  • 计数器rack_count(可据此筛选关联机架数量)。

search方法支持全文模糊检索,命中范围为modeldescriptioncomments三个字段:

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=42

GraphQL 查询

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(冷却馈线) 等对象落地,相关功能整体介绍见 冷却功能文档。

最佳实践小结

  1. 把物理规格定义在 Rack Type 上:NetBox 正在推动机架模型上形态因素、宽度、外部尺寸等字段的弃用(v5.0),尽早为每种型号建立 Rack Type 并分配给机架,可以避免未来的迁移成本。
  2. 善用属性继承:同一型号机架只需维护一份规格,修改类型后所有机架自动同步并产生变更日志,避免手工逐台更新。
  3. 善用过滤与搜索:通过 REST API 的manufacturerform_factorwidthcooling_capability等维度组合筛选,可快速定位某种规格的机架型号。
  4. 注意必填/联动校验:外部尺寸与单位、最大承重与重量单位必须成对填写,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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询