扩展模型
以下是在核心模型中添加新字段时需要考虑的任务列表。
1. 在模型类中添加字段
在模型中添加字段,并注意处理以下条件。
-
当添加GenericForeignKey字段时,还要在
Meta
下为其两个具体字段添加索引。例如:class Meta: indexes = ( models.Index(fields=('object_type', 'object_id')), )
2. 生成并运行数据库迁移
Django迁移用于表示对数据库模式的更改。在大多数情况下,Django可以自动生成这些迁移,但非常复杂的更改可能需要手动干预。始终记住在生成新迁移时指定一个简短但描述性的名称。
./manage.py makemigrations <app> -n <name> --no-header
./manage.py migrate
在可能的情况下,尝试将相关更改合并到单个迁移中。例如,如果要在应用程序内的不同模型中添加三个新字段,可以在单个迁移中表示这些更改。可以通过合并它们的operations
列表来将新生成的迁移与现有迁移合并。
不要更改现有迁移
迁移只能在发布版本内合并。一旦发布了新版本,就不能更改其迁移(除非是为了纠正错误)。
3. 在clean()
中添加验证逻辑
如果新字段引入了额外的验证要求(超出字段本身包含的内容),请在模型的clean()
方法中实现它们。在适当的时候,记得在你的自定义验证之前或之后使用super()
调用模型的原始方法:
class Foo(models.Model):
def clean(self):
super().clean()
# 自定义验证放在这里
if self.bar is None:
raise ValidationError()
4. 更新相关的查询集
如果要添加关系字段(例如ForeignKey
)并且打算在检索对象列表时包括数据,请确保适当使用prefetch_related()
包含字段。这将优化视图并避免不必要的数据库查询。
5. 更新API序列化器
扩展模型的API序列化器,在<app>.api.serializers
中包含新字段。在大多数情况下,不需要扩展嵌套序列化器,因为它产生模型的最小表示。
6. 添加字段到表单
根据需要扩展任何表单以包括新字段。这些表单位于每个应用程序的forms/
目录下。常见的表单包括:
- 创建/编辑 - 操作单个对象
- 批量编辑 - 一次对多个对象执行更改
- CSV导入 - 用于以CSV格式批量导入对象的表单
- 筛选器 - 显示用于筛选对象列表的选项(UI和API都包括)
7. 扩展对象过滤器集
如果新字段应该可筛选,请将其添加到模型的FilterSet
中。如果字段应该可搜索,请记住在FilterSet的search()
方法中查询它。
8. 添加列到对象表格
如果新字段将包含在对象列表视图中,请向模型的表格添加列。对于简单字段,将字段名称添加到Meta.fields
将足够。更复杂的字段可能需要声明自定义列。还将字段名称添加到default_columns
,如果该列应默认存在于表格中。
9. 更新SearchIndex
在适用的情况下,将新字段添加到模型的SearchIndex中,以包含在全局搜索中。
10. 更新UI模板
编辑对象的视图模板以显示新字段。还可能存在需要更新的自定义添加/编辑表单模板。
11. 创建/扩展测试用例
创建或扩展相关的测试用例,以验证新字段和任何相关的验证逻辑是否按预期工作。对于关系字段,这尤其重要。NetBox包含各种测试套件,包括:
- API序列化器/视图测试
- 筛选测试
- 表单测试
- 模型测试
- 视图测试
要保持谨慎,确保适当地适应或扩展所有相关的测试套件,以测试任何新功能。
12. 更新模型文档
每个模型都有一个专门的文档页面,位于models/<app>/<model>.md
。更新此文件以包括有关新字段的任何相关信息。