1. 程式人生 > >Django2.1.3框架中(fields.E300)和(fields.E307)報錯處理

Django2.1.3框架中(fields.E300)和(fields.E307)報錯處理

        使用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、資料庫表完成建立,日誌如下: