python_way ,day25 CMDB_models (数据库设计)

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‘
这样就可以查看数据库中的内容了

  

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

时间: 2024-10-18 14:27:55

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

Java精品高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,视频教程

36套精品Java架构师,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,P2P金融项目,大型分布式电商实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Elasticsearch,Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.ZeroMQ.Git.Nosql.Jvm.Mecached.Netty.Nio.Mina.java8新特性,P2P金融项目,程序设计,

数据库设计时不得不违背三范式的情景

1.在进销存系统中,订单信息中关联到好多其他的基本信息,比如:客户,付款方式,货运方式等,这些信息是有专门表进行维护的,在下订单时也是用下拉框选择的,但在保存订单信息时,不能只记录所谓的外键ID,而是应该同时记录名称等其他的信息. 这是因为订单不能因为没有了客户ID或是付款方式ID而不知道客户与付款方式了.对于订单这种客观存在的事物,是具有一定的历史性质的,因此在设计时应该与其他的关联信息可以“断开”,这也就是保证了订单的独立性. 摘自:http://www.cnblogs.com/tongtk

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

对于千万级与百万级数据库设计是有所区别的,由于本项目是基于中小型软件开发框架来设计,记录量相对会比较少,所以数据库设计时考虑的角度是:与开发相结合:空间换性能:空间换开发效率:减少null异常......当然不同的公司与项目要求不同,初学者要学会适应不同的项目开发要求,使用本框架开发时,必须严格按照本章节的要求来设计数据库,不然可能会产生不可控的异常. 从零开始编写自己的C#框架 数据库设计规范   文件状态: [√] 草稿 [  ] 正式发布 [  ] 正在修改 文件标识: C#框架 当前版本

数据库设计的三大范式

数据库设计的三大范式 为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际开发中最为常见的设计范式有三个: 1.第一范式 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式. 第一范式的合理遵循需要根据系统的实际需求来定.比如某些数据库系统中需要用到"地址"这个属性,本来直接将"

MySql三大范式与数据库设计和表创建常用语句

[数据库设计的三大范式] 1.第一范式(1NF First Normal Fromate):数据表中的每一列(字段),必须是不可拆分的最小单元.也就是确保每一列的原子性. 例如: userInfo: '山东省烟台市 13181621008' => userAds:'山东省烟台市' tel:'13181621008' 2.第二范式(2NF):满足1NF后,要求:表中所有的列,都必须功能依赖于主键,而不能有任何一列与主键没有关系.(一张表值描述一件事情) 3.第三范式(3NF):满足2NF后,要求:

MVC实战之排球计分(一)—— 需求分析与数据库设计

一.需求分析: 这个程序是排球计分程序,其业务非常简单,具体如下: 1.本程序可以选择用户身份,通过不同角度记录比赛分数. 2.不同身份记录的比赛成绩将会存储在不同的数据表(目前适合运动员和观众使用). 3.用户键入数据后,可以继续对数据进行操作(如:删除.修改.查看详情). 4,不同的身份的用户 ,不能修改非己的数据.只能修改自己的数据. 这个项目的用例图如下: 数据库设计:设计数据表之前,首先进行实体和关系的识别与确定.通过需求分析,可以观察得出,本项目的实体有:观众,运动员.(观众可以修改

02-大鸭梨博客系统数据库设计及Dapper的使用

毫无疑问,数据库的设计在一个系统中起了至关重要的作用.我们都知道,系统设计分为两部分,或者说是两个阶段,即数据库设计和功能设计.构建一个完善的系统需要这两个阶段的充分考量.周密设计.合理联接以及密切配合.数据库设计是整个系统的根基,它关乎系统功能的实现.稳定性.扩展性等多个方面,可见数据库设计的重要性. 那么好的数据库设计应该具备什么样的基本条件呢,大致有这么几点: 1.充分体现系统的需求 不管是数据库设计还是功能设计,我们最终的目的都是要实现客户的业务需求,所以数据库设计的第一准则就是要符合业

学生信息管理系统1(数据库设计篇)

1.系统概述 本次是做一个学生管理系统,在学了数据库之后,希望通过这个系统把所学知识应用与实际项目中去.加强自己的熟练程度. 开发背景:具备数据库,C#的相关知识储备,掌握基本的html知识. 用途:仅作练习用.通过一门语言,将数据库展现出来. 2.功能需求分析 系统概念层设计:功能用例图如下 1. 登录功能:用于身份认证 2. 数据操作:信息查询,数据的增删改.a) 数据操作里,管理员具备所有的操作权限.学生具有选课和查看的功能.以及可以修改自己的个人信息.3. UI设计 3.数据库设计 E-

数据库设计【笔记】

数据库设计 一.设计步骤   1.收集信息(来源项目需求分析)   2.标识实体(一般是需求分析中需要管理的信息名词)   3.标识每个实体的属性   4.实体之间的关系二.画e-r图(实体关系图)   1.矩形表示实体   2.椭圆表示实体的属性   3.菱形表示实体之间的关系   4.用直线连接实体和属性,实体和实体之间的关系三.实体之间的关系:   1.一对一  1:1          车和车位   2.一对多  1:N (1:M) 客人和客房   3.多对多  N:M