天天看點

Django2.1.3架構中(fields.E300)和(fields.E307)報錯處理        使用Django架構建立了Web項目,修改了模型models.py之後,執行資料庫遷移操作,出現如下報錯:models.py内容如下:報錯資訊如下: 解決方案:

        使用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,具體見下圖所示:

Django2.1.3架構中(fields.E300)和(fields.E307)報錯處理        使用Django架構建立了Web項目,修改了模型models.py之後,執行資料庫遷移操作,出現如下報錯:models.py内容如下:報錯資訊如下: 解決方案:

3、再次執行資料庫遷移操作:

python manage.py makemigrations
python manage.py migrate      

4、資料庫表完成建立,日志如下:

Django2.1.3架構中(fields.E300)和(fields.E307)報錯處理        使用Django架構建立了Web項目,修改了模型models.py之後,執行資料庫遷移操作,出現如下報錯:models.py内容如下:報錯資訊如下: 解決方案:

轉載于:https://www.cnblogs.com/tqtl911/p/10020343.html