from django.db import models
from django.contrib.auth.models import User # Create your models here. class UserProfile(User):
name = models.CharField("姓名", max_length=32) def __str__(self):
return self.name class Meta: #在admin中可以显示中文
super(User.Meta) #因为继承了父类的UserMeta 所以下面定义的verbose_name 就会把父类的同样的参数所覆盖。
verbose_name = '用户'
verbose_name_plural = "用户" class Asset(models.Model):
'''资产信息表'''
name = models.CharField(max_length=64, unique=True) # 资产名不要重复
asset_type_choices = (
('server', '服务器'),
('networkdevice', '网络设备'),
('storagedevice', '存储设备'),
('securitydevice', '安全设备'),
('securitydevice', '机房设备'),
# ('switch', u'交换机'),
# ('router', u'路由器'),
# ('firewall', u'防火墙'),
# ('storage', u'存储设备'),
# ('NLB', u'NetScaler'),
# ('wireless', u'无线AP'),
('software', '软件资产'),
# ('others', u'其它类'),
)
asset_type = models.CharField(choices=asset_type_choices, max_length=64, default='server')
business_unit = models.ForeignKey("BusinessUnit", blank=True, null=True)
sn = models.CharField(u'资产SN号', max_length=128, unique=True)
manufactory = models.ForeignKey('Manufactory', verbose_name='制造商', null=True, blank=True)
management_ip = models.GenericIPAddressField('管理IP', blank=True, null=True)
contract = models.ForeignKey('Contract', verbose_name='合同', null=True, blank=True)
trade_date = models.DateField('购买时间', null=True, blank=True)
expire_date = models.DateField('过保修期', null=True, blank=True)
price = models.FloatField('价格', null=True, blank=True)
idc = models.ForeignKey('IDC', verbose_name='IDC机房', null=True, blank=True)
admin = models.ForeignKey('UserProfile', verbose_name='资产管理员', null=True, blank=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, '小型机'),
(3, '阿里云'),
)
sub_asset_type = models.SmallIntegerField(choices=sub_assset_type_choices, verbose_name="服务器类型", default=0)
created_by_choices = (
('auto', 'Auto'),
('manual', 'Manual'),
)
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
model = models.CharField(verbose_name='型号', max_length=128, null=True, blank=True) # model 所有的设备都有型号,为什么不存放在公共字段
raid_type = models.CharField('raid类型', max_length=512, blank=True, null=True)
os_type = models.CharField('操作系统类型', max_length=64, blank=True, null=True)
os_distribution = models.CharField('发型版本', max_length=64, blank=True, null=True)
os_release = models.CharField('操作系统版本', 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 BusinessUnit(models.Model):
'''业务线'''
parent_unit = models.ForeignKey('self', null=True, blank=True)
name = models.CharField(max_length=64, unique=True) def __str__(self):
return self.name 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('VlanIP', blank=True, null=True)
intranet_ip = models.GenericIPAddressField('内网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('型号', max_length=128, null=True, blank=True)
firmware = models.CharField("固件", max_length=64, blank=True, null=True)
port_num = models.SmallIntegerField('端口个数', 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
'''
os_types_choice = (
(0, 'OS'),
(1, '办公\开发软件'),
(2, '业务软件'), )
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('软件/系统版本', max_length=64, help_text='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):
asset = models.OneToOneField('Asset') # onetoone 只是django在应用级别上的一对一关联,只是限定在一张表中同一个cpu不用同时关联多个assect。
cpu_model = models.CharField('CPU型号', max_length=128, blank=True)
cpu_count = models.SmallIntegerField('物理cpu个数')
cpu_core_count = models.SmallIntegerField(u'cpu核数')
memo = models.TextField('备注', 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('SN号', max_length=128, blank=True, null=True)
model = models.CharField(u'内存型号', max_length=128)
slot = models.CharField('插槽', max_length=64)
capacity = models.IntegerField('内存大小(MB)')
memo = models.CharField('备注', 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('SN号', max_length=128, blank=True, null=True)
slot = models.CharField('插槽位', max_length=64)
# manufactory = models.CharField(u'制造商', max_length=64,blank=True,null=True)
model = models.CharField('磁盘型号', max_length=128, blank=True, null=True)
capacity = models.FloatField('磁盘容量GB')
disk_iface_choice = (
('SATA', 'SATA'),
('SAS', 'SAS'),
('SCSI', 'SCSI'),
('SSD', 'SSD'),
) iface_type = models.CharField('接口类型', 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')
# server = models.ForeignKey('Server')
name = models.CharField('网卡名', max_length=64, blank=True, null=True)
sn = models.CharField('SN号', max_length=128, blank=True, null=True)
model = models.CharField('网卡型号', max_length=128, blank=True, null=True)
macaddress = models.CharField('MAC', max_length=64, unique=True)
ipaddress = models.GenericIPAddressField('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) # vip
memo = models.CharField('备注', 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):
asset = models.ForeignKey('Asset') #如果明确了一台服务器可以有多快raid卡就用foreignkey
# asset = models.OneToOneField('Asset') #如果一台机器只能有一块raid卡,那就用ontoon
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): #厂商是asset中的外面
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 Contract(models.Model): #合同
sn = models.CharField('合同号', max_length=128, unique=True)
name = models.CharField('合同名称', max_length=64)
memo = models.TextField('备注', blank=True, null=True)
price = models.IntegerField('合同金额')
detail = models.TextField('合同详细', blank=True, null=True)
start_date = models.DateField(blank=True)
end_date = models.DateField(blank=True)
license_num = models.IntegerField('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)
creater = models.ForeignKey('UserProfile')
create_date = models.DateField(auto_now_add=True) def __str__(self):
return self.name class EventLog(models.Model): #日志表
name = models.CharField('事件名称', max_length=100)
event_type_choices = (
(1, '硬件变更'),
(2, '新增配件'),
(3, '设备下线'),
(4, '设备上线'),
(5, '定期维护'),
(6, '业务上线\更新\变更'),
(7, '其它'),
)
event_type = models.SmallIntegerField('事件类型', choices=event_type_choices)
asset = models.ForeignKey('Asset') #一个资产可以有多个事件
component = models.CharField('事件子项', max_length=255, blank=True, null=True) #存储某一个位置发生的变更
detail = models.TextField('事件详情')
date = models.DateTimeField('事件时间', auto_now_add=True)
user = models.ForeignKey('UserProfile', verbose_name='事件源') #是谁产生的
memo = models.TextField('备注', 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'事件类型'

  

创建数据库:

python3 manage.py makemigretions
python3 manage.py migrate

创建用户

python3 manage.py creatiesuperuser

在django  admin中创建一个user,和一个资产asset

然后再使用命令查看一下这个资产的内容

python3 manage.py shell
from assets import models
models.Asset.objects.last().name()
>>> models.Asset.objects.last().name
'dell0811'
这样就可以查看数据库中的内容了

  

数据库完毕,然后就开始考虑数据怎么获取了

python_way ,day25 CMDB_models (数据库设计)的更多相关文章

  1. 数据库设计中的Soft Delete模式

    最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...

  2. 使用django开发博客过程记录1——数据库设计

    1.数据库设计 2.插入测试数据 3.配置相关问题 1.数据库设计 数据库有简单的三张表:Article.Category.Tag以下是代码 # -*- coding:utf-8 -*- from _ ...

  3. 基于SSM的租赁管理系统0.3_20161225_数据库设计

    数据库设计 1. 概念模型 2. 类模型 3. 生成SQL use test; /*========================================================== ...

  4. 第二天ci项目规划 数据库设计

    第二天ci项目规划 数据库设计 商品 + 用户 + 订单 数据库设计思想和方法 关于商品品牌 ,分类 ,属性 如何表示 用一个字段 还是再设计一张表 品牌和商品 是一种信息 还是两种信息 一张表一般只 ...

  5. 优化MySchool数据库设计之【巅峰对决】

    优化MySchool数据库设计 之独孤九剑 船舶停靠在港湾是很安全的,但这不是造船的目的 By:北大青鸟五道口原玉明老师 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识 ...

  6. 从零开始编写自己的C#框架(9)——数据库设计与创建

    对于千万级与百万级数据库设计是有所区别的,由于本项目是基于中小型软件开发框架来设计,记录量相对会比较少,所以数据库设计时考虑的角度是:与开发相结合:空间换性能:空间换开发效率:减少null异常.... ...

  7. 数据库设计(1/9):数据元(Data Elements)

    对于设计和创建数据库完全是个新手?没关系,Joe Celko,世界上读者数量最多的SQL作者之一,会告诉你这些基础.和往常一样,即使是最专业的数据库老手,也会给他们带来惊喜.Joe是DMBS杂志是多年 ...

  8. ABP 初探 之User、Role、Permission数据库设计 (EntityFramework 继承的另一种使用方法)

    最近群里(134710707)的朋友都在讨论ABP源码,我把最近学习的内容记录下来,同时也分享给大家,希望正在研究ABP源码的朋友有一定帮助. 上篇介绍ABP的多语言,本篇主要介绍权限的数据库设计,用 ...

  9. 优化MySchool数据库设计总结

    数据库的设计   一:什么是数据库设计? 数据库设计就是将数据库中的数据实体以及这些数据实体之间的关系,进行规范和结构化的过程. 二:为什么要实施数据库设计? 1:良好的数据库设计可以有效的解决数据冗 ...

随机推荐

  1. The Earth Mover's Distance

    The EMD is based on the minimal cost that must be paid to transform one distribution into the other. ...

  2. 使用 Git@OSC 管理代码

    开源中国的 git 服务的地址是:http://git.oschina.net/ 以下记录 push 本地已有的项目至 git@osc 的过程. ① 注册登录之后,创建一个自己的项目: 创建好的默认项 ...

  3. Objective-C 中类属性(修饰)

    Objective-C 中类属性(修饰) (2013-07-13 14:38:35) 转载▼ 标签: it 分类: IOS笔记 nonatomic: 非原子性访问,对属性赋值的时候不加锁,多线程并发访 ...

  4. ajax for in eval()知识点的应用

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. request.querystring和request.form、session的区别

    1. request.querystring是用来接收地址里面问号“?”后面的参数的内容,  用get方法读取的 不安全   request.form是用来接收表单递交来的数据 ,是用post方法读取 ...

  6. Selenium2学习-038-firefox、webdriver版本不对称问题解决:org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port 7055

    今天有个朋友在群里问,为何脚本运行不通过,其脚本操作步骤简单描述如下: 1.启动火狐浏览器 2.打开百度 3.查询框输入关键字 4.点击按钮[百度一下] 脚本挺简单的,其给出的应用报错信息如下所示: ...

  7. Java 一维数组 二维数组 三维数组

    二维数组包含一位数组  三维数组就是在二维数组的基础上,再加一层.把二维数组看做是一维数组就可以了,按照上述理解类推.   下面是 一维 二维 三维数组例子   一维数组: int[] array1 ...

  8. jQuery判断对象是否是函数

    var show=function () { // body... } if($.isFunction(show)){ //是函数 }else{ //不是函数 }

  9. select2插件的使用

    <select id="prd_tech_for_load" class="selectable" style="width:180px;&qu ...

  10. ubuntu 常用命令集合版(一)【大侠勿喷,菜鸟欢迎】(转载)

    1:apt-get:(一般是要加sudo) debian系系统的软件包管理程序(其图形化前端就是大名鼎鼎的新立得了),会自动帮你搞定依赖关系最常用参数:update        —-与你的软件源(在 ...