django的数据库模型中的域多次引用同一个外键(表)

执行python manage makemigrations OnlineUpgrade时,报如下错误:

D:\KLServer\pycode\KLServer>python manage.py makemigrations OnlineUpgrade
SystemCheckError: System check identified some issues:


ERRORS:
OnlineUpgrade.SoftwareUpgradeRecord.high_version: (fields.E304) Reverse accessor for 'SoftwareUpgradeRecord.high_version' clashes with reverse accessor for 'SoftwareVersionDiff.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareUpgradeRecord.high_version' or 'SoftwareVersionDiff.high_version'.
OnlineUpgrade.SoftwareUpgradeRecord.high_version: (fields.E304) Reverse accessor for 'SoftwareUpgradeRecord.high_version' clashes with reverse accessor for 'SubSoftwareKitVersionDiff.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareUpgradeRecord.high_version' or 'SubSoftwareKitVersionDiff.high_version'.
OnlineUpgrade.SoftwareUpgradeRecord.high_version: (fields.E305) Reverse query name for 'SoftwareUpgradeRecord.high_version' clashes with reverse query name for 'SoftwareVersionDiff.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareUpgradeRecord.high_version' or 'SoftwareVersionDiff.high_version'.
OnlineUpgrade.SoftwareUpgradeRecord.high_version: (fields.E305) Reverse query name for 'SoftwareUpgradeRecord.high_version' clashes with reverse query name for 'SubSoftwareKitVersionDiff.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareUpgradeRecord.high_version' or 'SubSoftwareKitVersionDiff.high_version'.
OnlineUpgrade.SoftwareUpgradeRecord.low_version: (fields.E304) Reverse accessor for 'SoftwareUpgradeRecord.low_version' clashes with reverse accessor for 'SoftwareVersionDiff.low_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareUpgradeRecord.low_version' or 'SoftwareVersionDiff.low_version'.
OnlineUpgrade.SoftwareUpgradeRecord.low_version: (fields.E305) Reverse query name for 'SoftwareUpgradeRecord.low_version' clashes with reverse query name for 'SoftwareVersionDiff.low_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareUpgradeRecord.low_version' or 'SoftwareVersionDiff.low_version'.
OnlineUpgrade.SoftwareVersionDiff.high_version: (fields.E304) Reverse accessor for 'SoftwareVersionDiff.high_version' clashes with reverse accessor for 'SoftwareUpgradeRecord.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareVersionDiff.high_version' or 'SoftwareUpgradeRecord.high_version'.
OnlineUpgrade.SoftwareVersionDiff.high_version: (fields.E304) Reverse accessor for 'SoftwareVersionDiff.high_version' clashes with reverse accessor for 'SubSoftwareKitVersionDiff.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareVersionDiff.high_version' or 'SubSoftwareKitVersionDiff.high_version'.
OnlineUpgrade.SoftwareVersionDiff.high_version: (fields.E305) Reverse query name for 'SoftwareVersionDiff.high_version' clashes with reverse query name for 'SoftwareUpgradeRecord.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareVersionDiff.high_version' or 'SoftwareUpgradeRecord.high_version'.
OnlineUpgrade.SoftwareVersionDiff.high_version: (fields.E305) Reverse query name for 'SoftwareVersionDiff.high_version' clashes with reverse query name for 'SubSoftwareKitVersionDiff.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareVersionDiff.high_version' or 'SubSoftwareKitVersionDiff.high_version'.
OnlineUpgrade.SoftwareVersionDiff.low_version: (fields.E304) Reverse accessor for 'SoftwareVersionDiff.low_version' clashes with reverse accessor for 'SoftwareUpgradeRecord.low_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareVersionDiff.low_version' or 'SoftwareUpgradeRecord.low_version'.
OnlineUpgrade.SoftwareVersionDiff.low_version: (fields.E305) Reverse query name for 'SoftwareVersionDiff.low_version' clashes with reverse query name for 'SoftwareUpgradeRecord.low_version'.
        HINT: Add or change a related_name argument to the definition for 'SoftwareVersionDiff.low_version' or 'SoftwareUpgradeRecord.low_version'.
OnlineUpgrade.SubSoftwareKitVersionDiff.high_version: (fields.E304) Reverse accessor for 'SubSoftwareKitVersionDiff.high_version' clashes with reverse accessor for 'SoftwareUpgradeRecord.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SubSoftwareKitVersionDiff.high_version' or 'SoftwareUpgradeRecord.high_version'.
OnlineUpgrade.SubSoftwareKitVersionDiff.high_version: (fields.E304) Reverse accessor for 'SubSoftwareKitVersionDiff.high_version' clashes with reverse accessor for 'SoftwareVersionDiff.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SubSoftwareKitVersionDiff.high_version' or 'SoftwareVersionDiff.high_version'.
OnlineUpgrade.SubSoftwareKitVersionDiff.high_version: (fields.E305) Reverse query name for 'SubSoftwareKitVersionDiff.high_version' clashes with reverse query name for 'SoftwareUpgradeRecord.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SubSoftwareKitVersionDiff.high_version' or 'SoftwareUpgradeRecord.high_version'.
OnlineUpgrade.SubSoftwareKitVersionDiff.high_version: (fields.E305) Reverse query name for 'SubSoftwareKitVersionDiff.high_version' clashes with reverse query name for 'SoftwareVersionDiff.high_version'.
        HINT: Add or change a related_name argument to the definition for 'SubSoftwareKitVersionDiff.high_version' or 'SoftwareVersionDiff.high_version'.



原来的模型代码:

@python_2_unicode_compatible
class SoftwareVersionDiff(models.Model):
    '''
    软件版本差分
    '''

    # 软件
    software = models.ForeignKey(to=Software, verbose_name='软件')

    # 低版本
    low_version = models.ForeignKey(to=Version,
                                    related_name='low_version', verbose_name='低版本')

    # 高版本
    high_version = models.ForeignKey(to=Version,
                                     related_name='high_version', verbose_name='高版本')


@python_2_unicode_compatible
class SubSoftwareKitVersionDiff(models.Model):
    '''
    软件子集版本差分
    '''

    # 软件子集
    subsoftwarekit = models.ForeignKey(to=SubSoftwareKit, verbose_name='软件子集')


    # 低版本
    low_version = models.ForeignKey(to=Version,
                                    related_name='low_versin_subsoftware', verbose_name='低版本')

    # 高版本
    high_version = models.ForeignKey(to=Version,
                                     related_name='high_version',verbose_name='高版本')


@python_2_unicode_compatible
class SoftwareUpgradeRecord(models.Model):
    '''
    软件更新记录,记录更新过程
    这里特别需要注意的是,一次更新请求中可能会有许多的软件需要更新,这个时候一次请求,可能会
    触发多次更新记录,因为每个软件更新的(低版本->高版本)是不一样的。
    '''
    # 更新的所有软件
    softwares = models.CharField(verbose_name='软件', max_length=2048, null=False)

    # 低版本
    low_version = models.ForeignKey(to=Version,
                                    related_name='low_version', verbose_name='低版本')

    # 高版本
    high_version = models.ForeignKey(to=Version,
                                     related_name='high_version', verbose_name='高版本')

原因: 因为在一个表中多次引用某个外键表,而且没有指定唯一的releated_name,而导致的。

解决方案:将同一个表中的releated_name,全部修改,指定不一样的releated_name

修改后的代码

 
  
@python_2_unicode_compatible
class SoftwareVersionDiff(models.Model):
    '''
    软件版本差分
    '''

    # 软件
    software = models.ForeignKey(to=Software, verbose_name='软件')

    # 低版本
    low_version = models.ForeignKey(to=Version,
                                    related_name='low_version_software_version_diff', verbose_name='低版本')

    # 高版本
    high_version = models.ForeignKey(to=Version,
                                     related_name='high_version_software_version_diff', verbose_name='高版本')


@python_2_unicode_compatible
class SubSoftwareKitVersionDiff(models.Model):
    '''
    软件子集版本差分
    '''

    # 软件子集
    subsoftwarekit = models.ForeignKey(to=SubSoftwareKit, verbose_name='软件子集')


    # 低版本
    low_version = models.ForeignKey(to=Version,
                                    related_name='low_versin_subsoftware_version_diff', verbose_name='低版本')

    # 高版本
    high_version = models.ForeignKey(to=Version,
                                     related_name='high_version_subsoftware_version_diff',verbose_name='高版本')


@python_2_unicode_compatible
class SoftwareUpgradeRecord(models.Model):
    '''
    软件更新记录,记录更新过程
    这里特别需要注意的是,一次更新请求中可能会有许多的软件需要更新,这个时候一次请求,可能会
    触发多次更新记录,因为每个软件更新的(低版本->高版本)是不一样的。
    '''
    # 更新的所有软件
    softwares = models.CharField(verbose_name='软件', max_length=2048, null=False)

    # 低版本
    low_version = models.ForeignKey(to=Version,
                                    related_name='low_version_software_upgrade_record', verbose_name='低版本')

    # 高版本
    high_version = models.ForeignKey(to=Version,
                                     related_name='high_version_software_upgrade_record', verbose_name='高版本')





你可能感兴趣的:(python,django)