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. 【转】oracle回闪操作

    在9i上执行的操作 查询test表中记录select * from test;删除test表中记录delete from test;获得过去的会话exec dbms_flashback.disable ...

  2. Thinking in Java——笔记(6)

    Access Control A piece of work isn't good until it's been rewritten, often many times. Thus a primar ...

  3. video

    <div class="index-video-wrapper"> <video autoplay loop poster="img/index-ima ...

  4. iTunes.exe 在win7系统中运行出错解决办法

    重新安装了iTunes打开后就报错,然后直接退出 查windows日志提示错误应用程序名称: iTunes.exe 错误模块名称: KERNELBASE.dll 重新安装iTunes问题依旧,后来在G ...

  5. LoadRunner,一个简单的例子

    一.录制脚本,这个就不说了,但是可以说说录完一个简单的脚本之后可以做的一些后续工作 1.设置事务的开始跟结束点(参考他人的http://www.cnblogs.com/fnng/archive/201 ...

  6. zepto源码--核心方法4(包装)--学习笔记

    主要介绍一下wrap, wrapAll, wrapInner, unwrap方法. wrapAll 在所有匹配元素外面包一个单独的结构.结构可以是单个元素或 几个嵌套的元素,并且可以是html字符串或 ...

  7. Qunie问题

    Quine 以哲学家 Willard van Orman Quine (1908-2000) 而命名,表示一个可以生成他自己的完全的源代码的程序.编写出某个语言中最简短的 quine 通常作为黑客们的 ...

  8. video和audio

    1.video 使用: <video width="320" height="240" src="http://www.jb51.net/mov ...

  9. java开发_读写txt文件操作

    package com.mi.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStr ...

  10. mongodb 安装、开启服务 和 php添加mongodb扩展

    1.下载mongodb:https://www.mongodb.org/downloads#production  (https://www.mongodb.org/dl/win32) 2.安装.配置 ...