繼續運維平台開發分享,昨天實作了基本的區域和IDC機房管理,今天來實作産品線、項目和環境的管理.
建立模型、序列化、視圖檔案
1、新增model_cmdb.py檔案,路徑apps/cmdb/model/model_cmdb.py
添加from .model_cmdb import *到apps/cmdb/model/__init__.py,檔案内容最終如下所示:
from .model_assets import *
from .model_cmdb import *
2、新增serialiser_cmdb.py檔案,路徑apps/cmdb/serializer/serialiser_cmdb.py
添加from .serialiser_cmdb import *到apps/cmdb/serializer/__init__.py,檔案最終内容如下:
from .serializer_assets import *
from .serialiser_cmdb import *
3、新增view_cmdb.py,路徑apps/cmdb/view/view_cmdb.py
添加from .view_cmdb import *到apps/cmdb/view/__init__.py,最終内容如下:
from .view_assets import *
from .view_cmdb import *
産品模型
建立産品模型
from django.db import models
from django.contrib.auth.models import User
from .model_assets import TimeAbstract, CommonParent, Region
class Product(TimeAbstract, CommonParent):
name = models.CharField(max_length=100, unique=True, verbose_name='産品')
alias = models.CharField(max_length=128, default='', verbose_name='産品别名')
region = models.ForeignKey(
Region, blank=True, null=True, on_delete=models.PROTECT, verbose_name='區域')
desc = models.TextField(verbose_name='詳情描述', null=True, blank=True)
prefix = models.CharField(
max_length=100, null=True, blank=True, verbose_name='字首')
creator = models.ForeignKey(User, on_delete=models.PROTECT, null=True, blank=True, verbose_name='産品建立人',
help_text='前端不需要傳遞')
managers = models.JSONField(default=dict, verbose_name='負責人',
help_text='存儲格式 對象: {"product": userid, "develop": userid};product: 産品負責人, develop: 技術負責人;值為int類型,存儲使用者ID.')
def __str__(self):
return self.name
class ExtMeta:
related = True
dashboard = True
icon = 'asset4'
class Meta:
verbose_name = '産品'
verbose_name_plural = verbose_name + '管理'
産品序列化器
from rest_framework import serializers
from cmdb.models import Product
class ProductSerializers(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
産品視圖
from rest_framework import viewsets
from cmdb.models import Product
from cmdb.serializers import ProductSerializers
class ProductViewSet(viewsets.ModelViewSet):
"""
産品視圖
### 産品權限
{'*': ('product_all', '産品管理')},
{'get': ('product_list', '檢視産品')},
{'post': ('product_create', '建立産品')},
{'put': ('product_edit', '編輯産品')},
{'patch': ('product_edit', '編輯産品')},
{'delete': ('product_delete', '删除産品')}
"""
perms_map = (
{'*': ('admin', '管理者')},
{'*': ('product_all', '産品管理')},
{'get': ('product_list', '檢視産品')},
{'post': ('product_create', '建立産品')},
{'put': ('product_edit', '編輯産品')},
{'patch': ('product_edit', '編輯産品')},
{'delete': ('product_delete', '删除産品')}
)
queryset = Product.objects.all()
serializer_class = ProductSerializers
添加路由
添加下面的代碼到devops_backend/urls.py
from cmdb.views import ProductViewSet
router.register('product', ProductViewSet)
最終内容如下:
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from cmdb.views import RegionViewSet, IdcViewSet, ProductViewSet
router = DefaultRouter()
router.register('region', RegionViewSet)
router.register('asset/idc', IdcViewSet)
router.register('product', ProductViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include(router.urls)),
]
建立表
# 我這裡已經寫好産品、項目和環境模型了
(venv) ➜ ydevops-backend python manage.py makemigrations
Migrations for 'cmdb':
apps/cmdb/migrations/0002_environment_product_project.py
- Create model Environment
- Create model Product
- Create model Project
(venv) ➜ ydevops-backend python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, cmdb, contenttypes, sessions
Running migrations:
Applying cmdb.0002_environment_product_project... OK
運作項目
按以下步驟操作後,我們再次把項目跑起來
python manage.py runserver 0.0.0.0:9000
打開浏覽器通路http://localhost:9000/api/,可以看到産品接口也已完成
項目和環境
按同樣的方式繼續完成項目和環境接口.
這裡有一點不一樣的是,我們在定義項目模型的時候,有個projectid字段,我們help_text也寫了前端不需要傳值的,也就是我們後端自己處理
class ProjectSerializers(ModelSerializer):
class Meta:
model = Project
fields = '__all__'
read_only_fields = ('projectid', )
@staticmethod
def perform_extend_save(validated_data):
_prefix = 'default'
if validated_data.get('product', None):
# 如果選擇了産品,則取産品name為字首
_prefix = validated_data['product'].name
if validated_data.get('parent', None):
# 存在上一級項目,則取上一級項目name為字首
_prefix = validated_data['parent'].name
if validated_data.get('name', None):
validated_data['projectid'] = f"{_prefix}.{validated_data['name']}"
return validated_data
def create(self, validated_data):
# 重寫建立方法
instance = Project.objects.create(**self.perform_extend_save(validated_data))
return instance
試試添加産品
填寫完後點選POST送出,然後點選GET擷取産品清單
OK,今天就到這......