表结构设计1详细注释代码

# _*_coding:utf-8_*_
__author__ = 'luoahong' from assets.myauth import UserProfile
from django.db import models class Asset(models.Model):
asset_type_choices = (
('server', u'服务器'),
('networkdevice', u'网络设备'),
('storagedevice', u'存储设备'),
('securitydevice', u'安全设备'),
('securitydevice', u'机房设备'),
# ('switch', u'交换机'),
# ('router', u'路由器'),
# ('firewall', u'防火墙'),
# ('storage', u'存储设备'),
# ('NLB', u'NetScaler'),
# ('wireless', u'无线AP'),
('software', u'软件资产'),
# ('others', u'其它类'),
)
asset_type = models.CharField(choices=asset_type_choices, max_length=64, default='server')
name = models.CharField(max_length=64, unique=True)
sn = models.CharField(u'资产SN号', max_length=128, unique=True)
manufactory = models.ForeignKey('Manufactory', verbose_name=u'制造商', null=True, blank=True)
# model = models.ForeignKey('ProductModel', verbose_name=u'型号')
# model = models.CharField(u'型号',max_length=128,null=True, blank=True ) management_ip = models.GenericIPAddressField(u'管理IP', blank=True, null=True) contract = models.ForeignKey('Contract', verbose_name=u'合同', null=True, blank=True)
trade_date = models.DateField(u'购买时间', null=True, blank=True)
expire_date = models.DateField(u'过保修期', null=True, blank=True)
price = models.FloatField(u'价格', null=True, blank=True)
business_unit = models.ForeignKey('BusinessUnit', verbose_name=u'所属业务线', null=True, blank=True)
tags = models.ManyToManyField('Tag', blank=True)
admin = models.ForeignKey('UserProfile', verbose_name=u'资产管理员', null=True, blank=True)
idc = models.ForeignKey('IDC', verbose_name=u'IDC机房', null=True, blank=True) status_choices = ((0, '在线'),
(1, '已下线'),
(2, '未知'),
(3, '故障'),
(4, '备用'),
)
status = models.SmallIntegerField(choices=status_choices, default=0)
# status = models.ForeignKey('Status', verbose_name = u'设备状态',default=1)
# Configuration = models.OneToOneField('Configuration',verbose_name='配置管理',blank=True,null=True) memo = models.TextField(u'备注', null=True, blank=True)
create_date = models.DateTimeField(blank=True, auto_now_add=True)
update_date = models.DateTimeField(blank=True, auto_now=True) class Meta:
verbose_name = '资产总表'
verbose_name_plural = "资产总表" def __str__(self):
return '<id:%s name:%s>' % (self.id, self.name) class Server(models.Model):
"""服务器设备"""
asset = models.OneToOneField('Asset')
sub_assset_type_choices = (
(0, 'PC服务器'),
(1, '刀片机'),
(2, '小型机'),
)
created_by_choices = (
('auto', 'Auto'),
('manual', 'Manual'),
)
sub_asset_type = models.SmallIntegerField(choices=sub_assset_type_choices, verbose_name="服务器类型", default=0)
created_by = models.CharField(choices=created_by_choices, max_length=32,
default='auto') # auto: auto created, manual:created manually
hosted_on = models.ForeignKey('self', related_name='hosted_on_server', blank=True, null=True) # for vitural server
# sn = models.CharField(u'SN号',max_length=128)
# management_ip = models.CharField(u'管理IP',max_length=64,blank=True,null=True)
# manufactory = models.ForeignKey(verbose_name=u'制造商',max_length=128,null=True, blank=True)
model = models.CharField(verbose_name=u'型号', max_length=128, null=True, blank=True)
# 若有多个CPU,型号应该都是一致的,故没做ForeignKey # nic = models.ManyToManyField('NIC', verbose_name=u'网卡列表')
# disk
raid_type = models.CharField(u'raid类型', max_length=512, blank=True, null=True)
# physical_disk_driver = models.ManyToManyField('Disk', verbose_name=u'硬盘',blank=True,null=True)
# raid_adaptor = models.ManyToManyField('RaidAdaptor', verbose_name=u'Raid卡',blank=True,null=True)
# memory
# ram_capacity = models.IntegerField(u'内存总大小GB',blank=True)
# ram = models.ManyToManyField('Memory', verbose_name=u'内存配置',blank=True,null=True) os_type = models.CharField(u'操作系统类型', max_length=64, blank=True, null=True)
os_distribution = models.CharField(u'发型版本', max_length=64, blank=True, null=True)
os_release = models.CharField(u'操作系统版本', max_length=64, blank=True, null=True) class Meta:
verbose_name = '服务器'
verbose_name_plural = "服务器"
# together = ["sn", "asset"] def __str__(self):
return '%s sn:%s' % (self.asset.name, self.asset.sn) class SecurityDevice(models.Model):
"""安全设备"""
asset = models.OneToOneField('Asset')
sub_assset_type_choices = (
(0, '防火墙'),
(1, '入侵检测设备'),
(2, '互联网网关'),
(4, '运维审计系统'),
)
sub_asset_type = models.SmallIntegerField(choices=sub_assset_type_choices, verbose_name="服务器类型", default=0) def __str__(self):
return self.asset.id class NetworkDevice(models.Model):
"""网络设备""" asset = models.OneToOneField('Asset')
sub_assset_type_choices = (
(0, '路由器'),
(1, '交换机'),
(2, '负载均衡'),
(4, 'VPN设备'),
)
sub_asset_type = models.SmallIntegerField(choices=sub_assset_type_choices, verbose_name="服务器类型", default=0) vlan_ip = models.GenericIPAddressField(u'VlanIP', blank=True, null=True)
intranet_ip = models.GenericIPAddressField(u'内网IP', blank=True, null=True)
# sn = models.CharField(u'SN号',max_length=128,unique=True)
# manufactory = models.CharField(verbose_name=u'制造商',max_length=128,null=True, blank=True)
model = models.CharField(u'型号', max_length=128, null=True, blank=True)
firmware = models.ForeignKey('Software', blank=True, null=True)
port_num = models.SmallIntegerField(u'端口个数', null=True, blank=True)
device_detail = models.TextField(u'设置详细配置', null=True, blank=True) class Meta:
verbose_name = '网络设备'
verbose_name_plural = "网络设备" class Software(models.Model):
'''
only save software which company purchased
'''
sub_assset_type_choices = (
(0, 'OS'),
(1, '办公\开发软件'),
(2, '业务软件'), )
sub_asset_type = models.SmallIntegerField(choices=sub_assset_type_choices, verbose_name="服务器类型", default=0)
license_num = models.IntegerField(verbose_name="授权数")
# os_distribution_choices = (('windows','Windows'),
# ('centos','CentOS'),
# ('ubuntu', 'Ubuntu'))
# type = models.CharField(u'系统类型', choices=os_types_choice, max_length=64,help_text=u'eg. GNU/Linux',default=1)
# distribution = models.CharField(u'发型版本', choices=os_distribution_choices,max_length=32,default='windows')
version = models.CharField(u'软件/系统版本', max_length=64, help_text=u'eg. CentOS release 6.5 (Final)', unique=True) # language_choices = (('cn',u'中文'),
# ('en',u'英文'))
# language = models.CharField(u'系统语言',choices = language_choices, default='cn',max_length=32)
# #version = models.CharField(u'版本号', max_length=64,help_text=u'2.6.32-431.3.1.el6.x86_64' ) def __str__(self):
return self.version class Meta:
verbose_name = '软件/系统'
verbose_name_plural = "软件/系统" class CPU(models.Model):
"""CPU组件""" asset = models.OneToOneField('Asset')
cpu_model = models.CharField(u'CPU型号', max_length=128, blank=True)
cpu_count = models.SmallIntegerField(u'物理cpu个数')
cpu_core_count = models.SmallIntegerField(u'cpu核数')
memo = models.TextField(u'备注', null=True, blank=True)
create_date = models.DateTimeField(auto_now_add=True)
update_date = models.DateTimeField(blank=True, null=True) class Meta:
verbose_name = 'CPU部件'
verbose_name_plural = "CPU部件" def __str__(self):
return self.cpu_model class RAM(models.Model):
"""内存组件""" asset = models.ForeignKey('Asset')
sn = models.CharField(u'SN号', max_length=128, blank=True, null=True)
model = models.CharField(u'内存型号', max_length=128)
slot = models.CharField(u'插槽', max_length=64)
capacity = models.IntegerField(u'内存大小(MB)')
memo = models.CharField(u'备注', max_length=128, blank=True, null=True)
create_date = models.DateTimeField(blank=True, auto_now_add=True)
update_date = models.DateTimeField(blank=True, null=True) def __str__(self):
return '%s:%s:%s' % (self.asset_id, self.slot, self.capacity) class Meta:
verbose_name = 'RAM'
verbose_name_plural = "RAM"
unique_together = ("asset", "slot") auto_create_fields = ['sn', 'slot', 'model', 'capacity'] class Disk(models.Model):
"""硬盘组件""" asset = models.ForeignKey('Asset')
sn = models.CharField(u'SN号', max_length=128, blank=True, null=True)
slot = models.CharField(u'插槽位', max_length=64)
# manufactory = models.CharField(u'制造商', max_length=64,blank=True,null=True)
model = models.CharField(u'磁盘型号', max_length=128, blank=True, null=True)
capacity = models.FloatField(u'磁盘容量GB')
disk_iface_choice = (
('SATA', 'SATA'),
('SAS', 'SAS'),
('SCSI', 'SCSI'),
('SSD', 'SSD'),
) iface_type = models.CharField(u'接口类型', max_length=64, choices=disk_iface_choice, default='SAS')
memo = models.TextField(u'备注', blank=True, null=True)
create_date = models.DateTimeField(blank=True, auto_now_add=True)
update_date = models.DateTimeField(blank=True, null=True) auto_create_fields = ['sn', 'slot', 'manufactory', 'model', 'capacity', 'iface_type'] class Meta:
unique_together = ("asset", "slot")
verbose_name = '硬盘'
verbose_name_plural = "硬盘" def __str__(self):
return '%s:slot:%s capacity:%s' % (self.asset_id, self.slot, self.capacity) class NIC(models.Model):
"""网卡组件""" asset = models.ForeignKey('Asset')
name = models.CharField(u'网卡名', max_length=64, blank=True, null=True)
sn = models.CharField(u'SN号', max_length=128, blank=True, null=True)
model = models.CharField(u'网卡型号', max_length=128, blank=True, null=True)
macaddress = models.CharField(u'MAC', max_length=64, unique=True)
ipaddress = models.GenericIPAddressField(u'IP', blank=True, null=True)
netmask = models.CharField(max_length=64, blank=True, null=True)
bonding = models.CharField(max_length=64, blank=True, null=True)
memo = models.CharField(u'备注', max_length=128, blank=True, null=True)
create_date = models.DateTimeField(blank=True, auto_now_add=True)
update_date = models.DateTimeField(blank=True, null=True) def __str__(self):
return '%s:%s' % (self.asset_id, self.macaddress) class Meta:
verbose_name = u'网卡'
verbose_name_plural = u"网卡"
# unique_together = ("asset_id", "slot")
unique_together = ("asset", "macaddress") auto_create_fields = ['name', 'sn', 'model', 'macaddress', 'ipaddress', 'netmask', 'bonding'] class RaidAdaptor(models.Model):
"""Raid卡""" asset = models.ForeignKey('Asset')
sn = models.CharField(u'SN号', max_length=128, blank=True, null=True)
slot = models.CharField(u'插口', max_length=64)
model = models.CharField(u'型号', max_length=64, blank=True, null=True)
memo = models.TextField(u'备注', blank=True, null=True)
create_date = models.DateTimeField(blank=True, auto_now_add=True)
update_date = models.DateTimeField(blank=True, null=True) def __str__(self):
return self.name class Meta:
unique_together = ("asset", "slot") class Manufactory(models.Model):
"""厂商""" manufactory = models.CharField(u'厂商名称', max_length=64, unique=True)
support_num = models.CharField(u'支持电话', max_length=30, blank=True)
memo = models.CharField(u'备注', max_length=128, blank=True) def __str__(self):
return self.manufactory class Meta:
verbose_name = '厂商'
verbose_name_plural = "厂商" class BusinessUnit(models.Model):
"""业务线""" parent_unit = models.ForeignKey('self', related_name='parent_level', blank=True, null=True)
name = models.CharField(u'业务线', max_length=64, unique=True) # contact = models.ForeignKey('UserProfile',default=None)
memo = models.CharField(u'备注', max_length=64, blank=True) def __str__(self):
return self.name class Meta:
verbose_name = '业务线'
verbose_name_plural = "业务线" class Contract(models.Model):
"""合同""" sn = models.CharField(u'合同号', max_length=128, unique=True)
name = models.CharField(u'合同名称', max_length=64)
memo = models.TextField(u'备注', blank=True, null=True)
price = models.IntegerField(u'合同金额')
detail = models.TextField(u'合同详细', blank=True, null=True)
start_date = models.DateField(blank=True)
end_date = models.DateField(blank=True)
license_num = models.IntegerField(u'license数量', blank=True)
create_date = models.DateField(auto_now_add=True)
update_date = models.DateField(auto_now=True) class Meta:
verbose_name = '合同'
verbose_name_plural = "合同" def __str__(self):
return self.name class IDC(models.Model):
"""机房""" name = models.CharField(u'机房名称', max_length=64, unique=True)
memo = models.CharField(u'备注', max_length=128, blank=True, null=True) def __str__(self):
return self.name class Meta:
verbose_name = '机房'
verbose_name_plural = "机房" class Tag(models.Model):
"""资产标签""" name = models.CharField('Tag name', max_length=32, unique=True)
creator = models.ForeignKey('UserProfile')
create_date = models.DateField(auto_now_add=True) def __str__(self):
return self.name class EventLog(models.Model):
"""事件""" name = models.CharField(u'事件名称', max_length=100)
event_type_choices = (
(1, u'硬件变更'),
(2, u'新增配件'),
(3, u'设备下线'),
(4, u'设备上线'),
(5, u'定期维护'),
(6, u'业务上线\更新\变更'),
(7, u'其它'),
)
event_type = models.SmallIntegerField(u'事件类型', choices=event_type_choices)
asset = models.ForeignKey('Asset')
component = models.CharField('事件子项', max_length=255, blank=True, null=True)
detail = models.TextField(u'事件详情')
date = models.DateTimeField(u'事件时间', auto_now_add=True)
user = models.ForeignKey('UserProfile', verbose_name=u'事件源')
memo = models.TextField(u'备注', blank=True, null=True) def __str__(self):
return self.name class Meta:
verbose_name = '事件纪录'
verbose_name_plural = "事件纪录" def colored_event_type(self):
if self.event_type == 1:
cell_html = '<span style="background: orange;">%s</span>'
elif self.event_type == 2:
cell_html = '<span style="background: yellowgreen;">%s</span>'
else:
cell_html = '<span >%s</span>'
return cell_html % self.get_event_type_display() colored_event_type.allow_tags = True
colored_event_type.short_description = u'事件类型' class NewAssetApprovalZone(models.Model):
"""新资产待审批区""" sn = models.CharField(u'资产SN号', max_length=128, unique=True)
asset_type_choices = (
('server', u'服务器'),
('switch', u'交换机'),
('router', u'路由器'),
('firewall', u'防火墙'),
('storage', u'存储设备'),
('NLB', u'NetScaler'),
('wireless', u'无线AP'),
('software', u'软件资产'),
('others', u'其它类'),
)
asset_type = models.CharField(choices=asset_type_choices, max_length=64, blank=True, null=True)
manufactory = models.CharField(max_length=64, blank=True, null=True)
model = models.CharField(max_length=128, blank=True, null=True)
ram_size = models.IntegerField(blank=True, null=True)
cpu_model = models.CharField(max_length=128, blank=True, null=True)
cpu_count = models.IntegerField(blank=True, null=True)
cpu_core_count = models.IntegerField(blank=True, null=True)
os_distribution = models.CharField(max_length=64, blank=True, null=True)
os_type = models.CharField(max_length=64, blank=True, null=True)
os_release = models.CharField(max_length=64, blank=True, null=True)
data = models.TextField(u'资产数据')
date = models.DateTimeField(u'汇报日期', auto_now_add=True)
approved = models.BooleanField(u'已批准', default=False)
approved_by = models.ForeignKey('UserProfile', verbose_name=u'批准人', blank=True, null=True)
approved_date = models.DateTimeField(u'批准日期', blank=True, null=True) def __str__(self):
return self.sn class Meta:
verbose_name = '新上线待批准资产'
verbose_name_plural = "新上线待批准资产"

models.py添加如下代码:

 from django.contrib.auth.models import User

 class UserPofile(User):
''''''
name = models.CharField("姓名",max_length=32)
def __str__(self):
return self.name

初始化数据库

python3 manage.py  makemigrations
python3 manage.py makemigrate

创建超级用户

python3 manage.py createsuperuser  

admin.py里添加:

admin.site.register(models.Asset)
admin.site.register(models.Server)
admin.site.register(models.NetworkDevice)
admin.site.register(models.IDC)
admin.site.register(models.BusinessUnit)
admin.site.register(models.Contract)
admin.site.register(models.CPU)
admin.site.register(models.Disk)
admin.site.register(models.NIC)
admin.site.register(models.RAM)
admin.site.register(models.Manufactory)
admin.site.register(models.Tag)
admin.site.register(models.Software)
admin.site.register(models.EventLog)

为什么有中文有英文?

注释前代码

    class Meta:
unique_together = ("asset", "slot") verbose_name = '硬盘'
verbose_name_plural = "硬盘"

注释掉

        verbose_name = '硬盘'
verbose_name_plural = "硬盘"

看看web有什么变化 

注释掉

        verbose_name_plural = "硬盘"

看看web有什么变化 

上面这就是Meta

 

是因为继承的原因

super(user.meate)

python manage.py shell
from assets import models
models.Asset.objects.last().admin
models.Asset.objects.last().admin.user
  1. 先继承,后扩展
  2. 我继承的不是user表,AbstracUser.Meta
  3. 要继承这个什么都要自己写,太复杂了

  

CMDB资产管理系统开发【day25】:表结构设计2的更多相关文章

  1. CMDB资产管理系统开发【day25】:需求分析

    本节内容 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infra ...

  2. CMDB资产管理系统开发【day25】:windows客户端开发

    1.目录结构 PS Y:\MadkingClient> tree /f 卷 netgame 的文件夹 PATH 列表 卷序列号为 ACE3-896E Y:. ├─bin │ NedStark.p ...

  3. CMDB资产管理系统开发【day25】:表结构设计1

    资产表 # _*_coding:utf-8_*_ __author__ = 'jieli' from assets.myauth import UserProfile from django.db i ...

  4. CMDB资产管理系统开发【day25】:Django 自定义用户认证

    官方文档:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substituting-a-custom-user-mode ...

  5. CMDB资产管理系统开发【day26】:数据正式存入待存区

    1.from表单提交 1.数据提交到哪里呢? 提交到assets/new_assets_approval.html这了 2.Yes, I'm sure提交了什么?          为什么没有下拉框了 ...

  6. CMDB资产管理系统开发【day26】:CMDB上节回顾

    一.上节知识点回顾 服务器设计了一个表结构 开发了一个客户端 二.后台创建缓存区表 客户端连接服务器,在服务器的下面看报错信息 因为URL都没有写,所以我找不到呀 1.在MadKing\url.py ...

  7. CMDB资产管理系统开发【day26】:admin action

    本节目标 审核写到数据库,我就单独写一个如下的 页面 单机go后就跳转到如下图界面,我们这节课的目标就是写一个这样的页面 asset\admin.py部分代码 注释如下: class NewAsset ...

  8. CMDB资产管理系统开发【day26】:实现资产自动更新

    1.需求分析 1.比对分析 比对的时候以那个数据源为主? old [1,2,3 ] db数据库 new [2,3,4 ] 客户端汇报过来的 当然以客户端汇报过来的数据为主 2.更新分析 不同的表到底拿 ...

  9. CMDB资产管理系统开发【day27】:理解RESTful架构

    理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(hig ...

随机推荐

  1. Chrome浏览器清除缓存

    1.功能列表点击历史记录 可以是按时间清除 自动清除: 使用谷歌的无痕模式可以自动清除缓存

  2. 统计 flv视频总时长

    在学习孟媛的视频课程.网上能下载的是flv格式.那我在学习之前,我要统计一下这个课程的数量,他会用多长时间,这样方便我在学习过程中不断的回顾,进行时间管理.我大概就可以统计出来这个视频多长时间可以学完 ...

  3. Saltstack_使用指南05_数据系统-Pillar

    1. 主机规划 Pillar文档 https://docs.saltstack.com/en/latest/topics/pillar/index.html 注意事项 修改了master或者minio ...

  4. 修改 TeamViewer ID 的方法

    TeamViewer 使用频繁后会被判定为商业用途,不可用.此软件的账号和设备mac地址绑定. 修改TeamViewer ID后可以重新开始使用.下述方法可以成功修改TeamViewer ID. 关闭 ...

  5. 【Python 03】程序设计与Python语言概述

    人生苦短,我用Python. Python在1990年诞生于荷兰,2010年Python2发布最后一版2.7,Python核心团队计划在2020年停止支持 Python2,目前Python3是未来. ...

  6. Autofs自动挂载探讨

    Autofs介绍: mount是用来挂载文件系统的,可以在系统启动的时候挂载也可以在系统启动后挂载.对于本地固定设 备,如硬盘可以使用mount挂载:而光盘.软盘.NFS.SMB等文件系统具有动态性, ...

  7. 网络二十四题 之 P2756 飞行员配对方案问题

    题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外 ...

  8. Linux实战教学笔记49:Zabbix监控平台3.2.4(一)搭建部署与概述

    https://www.cnblogs.com/chensiqiqi/p/9162986.html 一,Zabbix架构 zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企 ...

  9. Linux内存管理 (4)分配物理页面

    专题:Linux内存管理专题 关键词:分配掩码.伙伴系统.水位(watermark).空闲伙伴块合并. 我们知道Linux内存管理是以页为单位进行的,对内存的管理是通过伙伴系统进行. 从Linux内存 ...

  10. 三种方法实现Hadoop(MapReduce)全局排序(1)

    我们可能会有些需求要求MapReduce的输出全局有序,这里说的有序是指Key全局有序.但是我们知道,MapReduce默认只是保证同一个分区内的Key是有序的,但是不保证全局有序.基于此,本文提供三 ...