使用Django架構建立了Web項目,修改了模型models.py之後,執行資料庫遷移操作,出現如下報錯:
models.py内容如下:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Asset(models.Model):
"""所有資産的共有資料表"""
assets_type_choice = (
('Server', '伺服器'),
('NetworkDevice', '網絡裝置'),
('StorageDevice', '儲存設備'),
('SecurityDevice', '安全裝置'),
('Software', '軟體資産'),
)
asset_status = (
(0, '線上'),
(1, '下線'),
(2, '未知'),
(3, '故障'),
(4, '備用'),
)
asset_type = models.CharField(choices=assets_type_choice, max_length=64, default='Server', verbose_name='資産類型')
name = models.CharField(max_length=64, unique=True, verbose_name='資産名稱') # 不可重複
sn = models.CharField(max_length=128, unique=True, verbose_name='資産序列号') # 不可重複
business_unit = models.ForeignKey('BusinessUnit', null=True, blank=True, verbose_name='所屬業務線',
on_delete=models.CASCADE)
status = models.CharField(choices=asset_status, max_length=64, default=0, verbose_name='裝置狀态')
manufacturer = models.ForeignKey('Manufacturer', null=True, blank=True, verbose_name='裝置制造商',
on_delete=models.CASCADE)
manage_ip = models.GenericIPAddressField(null=True, blank=True, verbose_name='管理IP')
tags = models.ManyToManyField('Tag', blank=True, verbose_name='标簽')
admin = models.ForeignKey(User, null=True, blank=True, verbose_name='資産管理者', related_name='admin',
on_delete=models.CASCADE)
idc = models.ForeignKey('IDC', null=True, blank=True, verbose_name='所在資料中心', on_delete=models.CASCADE)
contract = models.ForeignKey('Contract', null=True, blank=True, verbose_name='合同', on_delete=models.CASCADE)
purchase_date = models.DateField(null=True, blank=True, verbose_name='購買日期')
expire_date = models.DateField(null=True, blank=True, verbose_name='過保日期')
price = models.FloatField(null=True, blank=True, verbose_name='價格')
approved_by = models.ForeignKey(User, null=True, blank=True, verbose_name='準許人',
related_name='approved_by',
on_delete=models.CASCADE)
memo = models.TextField(null=True, blank=True, verbose_name='備注')
c_time = models.DateTimeField(auto_now_add=True, verbose_name='準許日期')
m_time = models.DateTimeField(auto_now=True, verbose_name='更新日期')
def __str__(self):
return '<%s> %s' % (self.get_asset_type_display(), self.name)
class Meta:
verbose_name = '資産總表'
verbose_name_plural = verbose_name
ordering = ['-c_time']
class Server(models.Model):
"""伺服器裝置"""
sub_asset_type_choice = (
(0, 'PC伺服器'),
(1, '刀片機'),
(2, '小型機'),
)
created_by_choice = (
('auto', '自動添加'),
('manual', '手工錄入'),
)
asset = models.OneToOneField('Asset', on_delete=models.CASCADE) # 非常關鍵的一對一關聯!
sub_asset_type = models.SmallIntegerField(choices=sub_asset_type_choice, default=0, verbose_name="伺服器類型")
created_by = models.CharField(choices=created_by_choice, max_length=32, default='auto', verbose_name="添加方式")
hosted_on = models.ForeignKey('self', related_name='hosted_on_server',
blank=True, null=True, verbose_name="主控端", on_delete=models.CASCADE) # 虛拟機專用字段
model = models.CharField(max_length=128, null=True, blank=True, verbose_name='伺服器型号')
raid_type = models.CharField(max_length=512, blank=True, null=True, verbose_name='Raid類型')
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)
def __str__(self):
return '%s--%s--%s <sn:%s>' % (self.asset.name, self.get_sub_asset_type_display(), self.model, self.asset.sn)
class Meta:
verbose_name = '伺服器'
verbose_name_plural = "伺服器"
class SecurityDevice(models.Model):
"""安全裝置"""
sub_asset_type_choice = (
(0, '防火牆'),
(1, '入侵檢測裝置'),
(2, '網際網路網關'),
(4, '運維審計系統'),
)
asset = models.OneToOneField('Asset', on_delete=models.CASCADE)
sub_asset_type = models.SmallIntegerField(choices=sub_asset_type_choice, default=0, verbose_name="安全裝置類型")
def __str__(self):
return self.asset.name + "--" + self.get_sub_asset_type_display() + " id:%s" % self.id
class Meta:
verbose_name = '安全裝置'
verbose_name_plural = "安全裝置"
class StorageDevice(models.Model):
"""儲存設備"""
sub_asset_type_choice = (
(0, '磁盤陣列'),
(1, '網絡存儲器'),
(2, '錄音帶庫'),
(4, '錄音帶機'),
)
asset = models.OneToOneField('Asset', on_delete=models.CASCADE)
sub_asset_type = models.SmallIntegerField(choices=sub_asset_type_choice, default=0, verbose_name="儲存設備類型")
def __str__(self):
return self.asset.name + "--" + self.get_sub_asset_type_display() + " id:%s" % self.id
class Meta:
verbose_name = '儲存設備'
verbose_name_plural = "儲存設備"
class NetworkDevice(models.Model):
"""網絡裝置"""
sub_asset_type_choice = (
(0, '路由器'),
(1, '交換機'),
(2, '負載均衡'),
(4, 'VPN裝置'),
)
asset = models.OneToOneField('Asset', on_delete=models.CASCADE)
sub_asset_type = models.SmallIntegerField(choices=sub_asset_type_choice, default=0, verbose_name="網絡裝置類型")
vlan_ip = models.GenericIPAddressField(blank=True, null=True, verbose_name="VLanIP")
intranet_ip = models.GenericIPAddressField(blank=True, null=True, verbose_name="内網IP")
model = models.CharField(max_length=128, null=True, blank=True, verbose_name="網絡裝置型号")
firmware = models.CharField(max_length=128, blank=True, null=True, verbose_name="裝置固件版本")
port_num = models.SmallIntegerField(null=True, blank=True, verbose_name="端口個數")
device_detail = models.TextField(null=True, blank=True, verbose_name="詳細配置")
def __str__(self):
return '%s--%s--%s <sn:%s>' % (self.asset.name, self.get_sub_asset_type_display(), self.model, self.asset.sn)
class Meta:
verbose_name = '網絡裝置'
verbose_name_plural = "網絡裝置"
class Software(models.Model):
"""
隻儲存付費購買的軟體
"""
sub_asset_type_choice = (
(0, '作業系統'),
(1, '辦公\開發軟體'),
(2, '業務軟體'),
)
sub_asset_type = models.SmallIntegerField(choices=sub_asset_type_choice, default=0, verbose_name="軟體類型")
license_num = models.IntegerField(default=1, verbose_name="授權數量")
version = models.CharField(max_length=64, unique=True, help_text='例如: CentOS release 6.7 (Final)',
verbose_name='軟體/系統版本')
def __str__(self):
return '%s--%s' % (self.get_sub_asset_type_display(), self.version)
class Meta:
verbose_name = '軟體/系統'
verbose_name_plural = "軟體/系統"
class IDC(models.Model):
"""機房"""
name = models.CharField(max_length=64, unique=True, verbose_name="機房名稱")
memo = models.CharField(max_length=128, blank=True, null=True, verbose_name='備注')
def __str__(self):
return self.name
class Meta:
verbose_name = '機房'
verbose_name_plural = "機房"
class Manufacturer(models.Model):
"""廠商"""
name = models.CharField('廠商名稱', max_length=64, unique=True)
telephone = models.CharField('支援電話', max_length=30, blank=True, null=True)
memo = models.CharField('備注', max_length=128, blank=True, null=True)
def __str__(self):
return self.name
class Meta:
verbose_name = '廠商'
verbose_name_plural = "廠商"
class BusinessUnit(models.Model):
"""業務線"""
parent_unit = models.ForeignKey('self', blank=True, null=True, related_name='parent_level',
on_delete=models.CASCADE)
name = models.CharField('業務線', max_length=64, unique=True)
memo = models.CharField('備注', max_length=64, blank=True, null=True)
def __str__(self):
return self.name
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_day = models.DateField('開始日期', blank=True, null=True)
end_day = models.DateField('失效日期', blank=True, null=True)
license_num = models.IntegerField('license數量', blank=True, null=True)
c_day = models.DateField('建立日期', auto_now_add=True)
m_day = models.DateField('修改日期', auto_now=True)
def __str__(self):
return self.name
class Meta:
verbose_name = '合同'
verbose_name_plural = "合同"
class Tag(models.Model):
"""标簽"""
name = models.CharField('标簽名', max_length=32, unique=True)
c_day = models.DateField('建立日期', auto_now_add=True)
def __str__(self):
return self.name
class Meta:
verbose_name = '标簽'
verbose_name_plural = "标簽"
class Disk(models.Model):
"""儲存設備"""
disk_interface_type_choice = (
('SATA', 'SATA'),
('SAS', 'SAS'),
('SCSI', 'SCSI'),
('SSD', 'SSD'),
('unknown', 'unknown'),
)
asset = models.ForeignKey('Asset', on_delete=models.CASCADE)
sn = models.CharField('硬碟SN号', max_length=128)
slot = models.CharField('所在插槽位', max_length=64, blank=True, null=True)
model = models.CharField('磁盤型号', max_length=128, blank=True, null=True)
manufacturer = models.CharField('磁盤制造商', max_length=128, blank=True, null=True)
capacity = models.FloatField('磁盤容量(GB)', blank=True, null=True)
interface_type = models.CharField('接口類型', max_length=16, choices=disk_interface_type_choice, default='unknown')
def __str__(self):
return '%s: %s: %s: %sGB' % (self.asset.name, self.model, self.slot, self.capacity)
class Meta:
verbose_name = '硬碟'
verbose_name_plural = "硬碟"
unique_together = ('asset', 'sn')
class EventLog(models.Model):
"""
日志.
在關聯對象被删除的時候,不能一并删除,需保留日志。
是以,on_delete=models.SET_NULL
"""
name = models.CharField('事件名稱', max_length=128)
event_type_choice = (
(0, '其它'),
(1, '硬體變更'),
(2, '新增配件'),
(3, '裝置下線'),
(4, '裝置上線'),
(5, '定期維護'),
(6, '業務上線\更新\變更'),
)
asset = models.ForeignKey('Asset', blank=True, null=True, on_delete=models.SET_NULL) # 當資産審批成功時有這項資料
new_asset = models.ForeignKey('NewAssetApprovalZone', blank=True, null=True,
on_delete=models.SET_NULL) # 當資産審批失敗時有這項資料
event_type = models.SmallIntegerField('事件類型', choices=event_type_choice, default=4)
component = models.CharField('事件子項', max_length=256, blank=True, null=True)
detail = models.TextField('事件詳情')
date = models.DateTimeField('事件時間', auto_now_add=True)
user = models.ForeignKey(User, blank=True, null=True, verbose_name='事件執行人',
on_delete=models.SET_NULL) # 自動更新資産資料時沒有執行人
memo = models.TextField('備注', blank=True, null=True)
def __str__(self):
return self.name
class Meta:
verbose_name = '事件紀錄'
verbose_name_plural = "事件紀錄"
class NewAssetApprovalZone(models.Model):
"""新資産待審批區"""
sn = models.CharField('資産SN号', max_length=128, unique=True) # 此字段必填
asset_type_choice = (
('server', '伺服器'),
('networkdevice', '網絡裝置'),
('storagedevice', '儲存設備'),
('securitydevice', '安全裝置'),
('IDC', '機房'),
('software', '軟體資産'),
)
asset_type = models.CharField(choices=asset_type_choice, default='server', max_length=64, blank=True, null=True,
verbose_name='資産類型')
manufacturer = models.CharField(max_length=64, blank=True, null=True, verbose_name='生産廠商')
model = models.CharField(max_length=128, blank=True, null=True, verbose_name='型号')
ram_size = models.PositiveIntegerField(blank=True, null=True, verbose_name='記憶體大小')
cpu_model = models.CharField(max_length=128, blank=True, null=True, verbose_name='CPU型号')
cpu_count = models.PositiveSmallIntegerField(blank=True, null=True)
cpu_core_count = models.PositiveSmallIntegerField(blank=True, null=True)
os_distribution = models.CharField(max_length=64, blank=True, null=True)
os_type = models.CharField(max_length=64, blank=True, null=True)
os_release = models.CharField(max_length=64, blank=True, null=True)
data = models.TextField('資産資料') # 此字段必填
c_time = models.DateTimeField('彙報日期', auto_now_add=True)
m_time = models.DateTimeField('資料更新日期', auto_now=True)
approved = models.BooleanField('是否準許', default=False)
def __str__(self):
return self.sn
class Meta:
verbose_name = '新上線待準許資産'
verbose_name_plural = "新上線待準許資産"
ordering = ['-c_time']
報錯資訊如下:
Django報錯處理:
SystemCheckError: System check identified some issues:
ERRORS:
assets.Asset.admin: (fields.E300) Field defines a relation with model 'User', which is either not installed, or is abstract.
assets.Asset.admin: (fields.E307) The field assets.Asset.admin was declared with a lazy reference to 'assets.user', but app 'assets' doesn't provide model 'user'.
assets.Asset.approved_by: (fields.E300) Field defines a relation with model 'User', which is either not installed, or is abstract.
assets.Asset.approved_by: (fields.E307) The field assets.Asset.approved_by was declared with a lazy reference to 'assets.user', but app 'assets' doesn't provide model 'user'.
assets.EventLog.user: (fields.E300) Field defines a relation with model 'User', which is either not installed, or is abstract.
assets.EventLog.user: (fields.E307) The field assets.EventLog.user was declared with a lazy reference to 'assets.user', but app 'assets' doesn't provide model 'user'.
解決方案:
1、在settings.py中添加如下配置:
SILENCED_SYSTEM_CHECKS = ['fields.E300', 'fields.E307']
2、将models.py檔案中的'User'去掉雙引号,改為User,具體見下圖所示:

3、再次執行資料庫遷移操作:
python manage.py makemigrations
python manage.py migrate
4、資料庫表完成建立,日志如下:
轉載于:https://www.cnblogs.com/tqtl911/p/10020343.html