三.通過Model建立數據庫信息

1.model簡介

model在django的官方文檔是這樣解釋的:

A model is the single, definitive source ofinformation about your data. It contains the essential fields and behaviors ofthe data you’re storing. Generally, each model maps to a single database table.

The basics:

Each model is a Python class thatsubclasses django.db.models.Model.

Each attribute of the model represents adatabase field.

With all of this, Django gives you anautomatically-generated database-access API; seeMakingqueries

 

簡言之,model是對數據結構的定義,可以自動生成數據庫。

 

根據項目,我們需要以下三張信息登記表格.

Node表:記錄各節點情況


Line表:記錄線路信息


Device表:記錄設備情況


三張表中,我們認爲設備基於節點建立,因此node表和device表是一對多的關係。

而對於大多數數據中心,都是一個數據中心多個分支節點的機構,所以我們也可以把它看成一個星狀結構,那麼可以和node形成一對一,或一對多的關係(因爲有些分支可能是雙線)。爲了今後的擴展,我們將node和line表做一對多的關係處理。

 

2.三種數據庫模式的區別:

One-to-onerelationships (一對一關係)

兩個表中的字段有一對一的對應關係,最常用於對錶的擴展。例如,Django有一張User表,如果你想對這張表擴充,但又不想影響它原來的表結構,那麼可以生成一張Employee表,並與User表形成一對一的關係,之後我們會提到。

Many-to-onerelationships(多對一關係)

比如,一個車輛製造商可以製造出很多輛車,很多輛車都是由一個製造商生產的。在class中,需要用foreign-key字段顯式地表明。

Many-to-manyrelationships (對多對關係)

比如,一個披薩可能有很種澆頭,而不同的澆頭又可以用在不同的披薩上。在class中,需要用ManytoManyField顯式地表明。

 

應該說,上述三種關係,能夠滿足表與表之間絕大多數的關係。那麼在隨後的數據定義中,device和line將有foreign-key的關鍵字來描述他們與node的關係。

 

3.建立三張表,並通過django後臺進行管理

根據表結構,我們在models.py中建立相關class

 

1)Node表格的建立

models.py:

# -*- coding: UTF-8 -*-
#遷移時,能使python2的語法運用在python3上
from __future__ import unicode_literals

from django.db import models

# Create your models here.

class Node(models.Model):

    #線路的類型選擇,作爲node_type的選項
    type = (
        (U'總部','總部'),
        (U'分部','分部'),
    )
#verbose_name可以讓admin後臺顯示自定義的中文名字,而非字段
node_name = models.CharField(verbose_name='節點名稱',max_length=255)
    #choices找到type元組,並調用相關內容
    node_type = models.CharField(verbose_name='節點類型',max_length=50,choices=type)
    node_address = models.CharField(verbose_name='節點地址',max_length=255)
    #blank爲空,代表在form中可以允許不填
    node_contact = models.CharField(verbose_name='節點聯繫人',max_length=255,blank=True)
    #default表示默認值
    node_signer = models.CharField(verbose_name='登記人',max_length=50, default='system')
    node_remarks = models.CharField(verbose_name='備註',max_length=255,blank=True)
    #登記時間設置爲自動記錄,不會出現在選項中
    node_signtime = models.DateField(auto_now_add= True)
    
    #返回相應的值
    def __unicode__(self):
        return self.node_name

2)運行python manage.py makemigrations進行校驗


3)運行python manage.pymigrate 生成相關表



4)在admin.py下進行註冊,在ADMIN後臺顯示該表,並提供默認的增刪改查功能

admin.py:

from django.contrib import admin

# Register your models here.
from .models import Node

admin.site.register(Node)


5)啓動測試服務器,登陸admin後臺進行驗證

可以發現Nodes這個表已經出現在了admin中,並可以利用這個後臺進行增刪改查


6)利用admin後臺在Nodes表中增加一條信息


其中加粗的字體爲必填項


7)添加保存後,發現只有node_name一個字段的值,若要添加,則更改admin.py中的項

admin.py:

from django.contrib import admin

# Register your models here.
from .models import Node

class NodeAdmin(admin.ModelAdmin):
    list_display = ('node_name','node_address','node_signer')

admin.site.register(Node,NodeAdmin)

經過配置,現在頁面僅顯示list_display中的項



8)由於登記人的值我們希望能夠自動記錄相應登陸用戶,因此在增加項目中取消登記人這一欄,並將登錄用戶作爲登記人

admin.py:

# -*- coding: UTF-8 -*-
from django.contrib import admin

# Register your models here.
from .models import Node

#對NodeAdmin進行個性化配置
class NodeAdmin(admin.ModelAdmin):
    #在list頁面上顯示指定的字段
    list_display = ('node_name','node_address','node_signer')
    #在編輯、新增頁面上排除node_signer的選項
    exclude = ['node_signer']
    #對保存函數進行更改,將登錄用戶設置爲登記人
    def save_model(self, request, obj, form, change):
        obj.node_signer = str(request.user)
        obj.save()

admin.site.register(Node,NodeAdmin)

新增列表中已經沒有了node_signer

同時以登錄人作爲登記人

9)線路表格Line個device表格的建立:

和node是都是一對多的關係,那麼會有foreign-key,表格建立如下:

models.py:

#建立線路信息表
class Line(models.Model):

    #與node形成一對多的關係,在刪除node的同時,如果有線路信息依附在該節點上,那麼刪除失敗
    node = models.ForeignKey(Node,on_delete=models.PROTECT)

    #運營商分類
    spname = (
        (u'中國電信','中國電信'),
        (u'中國聯通','中國聯通'),
        (u'中國移動','中國移動'),
        (u'中國鐵通','中國鐵通'),
        (u'其他','其他')
    )
    #線路速率
    speed = (
        ('2M','2M'),
        ('4M','4M'),
        ('6M','6M'),
        ('10M','10M'),
        (u'其他','其他'),
    )
    #線路類型
    type = (
        ('MSTP','MSTP'),
        ('MSAP','MASP'),
        ('SDH','SDH'),
        ('DIAL','DIAL'),
        (u'其他','其他'),
    )

    line_code = models.CharField(verbose_name='線路編號',max_length=100)
    line_local = models.CharField(verbose_name='所在機房',max_length=50,default='上海數據中心')
    line_speed = models.CharField(verbose_name='線路速率',max_length=10,choices=speed,default='6M')
    line_spname = models.CharField(verbose_name='運營商',max_length=10,choices=spname,default='信網公司')
    line_type = models.CharField(verbose_name='線路類型',max_length=50,choices=type,default='MSTP')
    line_status = models.BooleanField(verbose_name='線路啓用',default=True)
    line_open = models.DateField(verbose_name='開通時間')
    line_closed = models.DateField(verbose_name='關閉時間',blank=True,null=True)
    line_signer = models.CharField(verbose_name='登記人',max_length=30,default='system')
    line_signtime = models.DateField(auto_now_add=True)
    line_remarks = models.CharField(verbose_name='備註',max_length=255,blank=True)

    def __unicode__(self):
        return self.line_code

#建立設備信息表
class Device(models.Model):

    node = models.ForeignKey(Node, on_delete=models.PROTECT)

    vendor = (
        ('CISCO', 'CISCO'),
        ('JUNIPER','JUNIPER'),
        ('TOPSEC','TOPSEC'),
        ('HUAWEI','HUAWEI'),
        ('H3C','H3C'),
    )

    device_caption = models.CharField(verbose_name='設備名稱',max_length=100)
    device_serial = models.CharField(verbose_name='設備序列號',max_length=100)
    device_type = models.CharField(verbose_name='設備型號',max_length=50)
    device_vendor = models.CharField(verbose_name='設備廠商',max_length=50,choices=vendor)
    device_remark = models.CharField(verbose_name='備註',max_length=50,blank=True)
    device_ip = models.GenericIPAddressField(verbose_name='管理IP')
    device_status = models.CharField(verbose_name='設備狀態',max_length=10,default='啓用')
    device_signer = models.CharField(verbose_name='登記人',max_length=30,default='system')
    device_signtime = models.DateField(auto_now_add=True)

    def __unicode__(self):
        return self.device_caption

10)在admin.py中註冊:

from .models import Node, Line, Device

class LineAdmin(admin.ModelAdmin):
    #在編輯、新增頁面上排除line_signer的選項
    exclude = ('line_signer',)
    #對保存函數進行更改,將登錄用戶設置爲登記人
    def save_model(self, request, obj, form, change):
        obj.line_signer = str(request.user)
        obj.save()

class DeviceAdmin(admin.ModelAdmin):
    #在編輯、新增頁面上排除device_signer的選項
    exclude = ('device_signer',)
    #對保存函數進行更改,將登錄用戶設置爲登記人
    def save_model(self, request, obj, form, change):
        obj.device_signer = str(request.user)
        obj.save()

admin.site.register(Line,LineAdmin)
admin.site.register(Device,DeviceAdmin)


11)進行Django數據庫同步,啓動測試服務器,並進入後臺管理平臺查看,並增加一條線路信息。


可以看到由於有foreign-key的關係,我們在NODE這個字段中就會出現下拉菜單,而菜單中的數據來源於NODE的信息。

 

12)通過同樣方法,可以增加設備信息。

 

至此,一個簡單的增刪改查的運維信息系統構建完成。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章