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)通過同樣方法,可以增加設備信息。
至此,一個簡單的增刪改查的運維信息系統構建完成。