Django模型将IntegerField转换为ForeingKey保持日期

时间:2017-11-03 16:35:51

标签: python django foreign-keys migration models

我正在一个项目中工作,我需要将IntegerField迁移到ForeingKey,以便更容易地执行请求:SKU_name,SKU_description等。

我的models.py文件有:

class BasketTable(models.Model):
    """Basket table."""

    SKU_Id = models.IntegerField(default=0, verbose_name="ID do SKU")
    Quantity = models.IntegerField(default=0, verbose_name="Quantidade")

我尝试将SKU_Id更改为SKU字段名称,设置:

SKU = models.ForeignKey(SKUTable, db_column='Id', to_field='Id', null=True, verbose_name="ID do SKU")

根据Django文档,我的SKU_Id字段根据需要有unique=True

因此,在此更改之后,我运行python manage.py makemigrations命令,结果是:

class Migration(migrations.Migration):

    dependencies = [
    ]

    operations = [
        migrations.RemoveField(
            model_name='baskettable',
            name='SKU_Id',
        ),
        migrations.AddField(
            model_name='baskettable',
            name='SKU',
            field=models.ForeignKey(db_column='Id', null=True, on_delete=django.db.models.deletion.CASCADE, to='products.SKUTable', to_field='Id', verbose_name='ID do SKU'),
        ),
    ]

因此,我将此迁移文件更改为:

class Migration(migrations.Migration):

    dependencies = [
    ]

    operations = [
        migrations.AlterField(
            model_name='baskettable',
            name='SKU_Id',
            field=models.IntegerField(db_column='Id')
        ),
        migrations.RenameField(
            model_name='baskettable',
            old_name='SKU_Id',
            new_name='SKU',
        ),
        migrations.AlterField(
            model_name='baskettable',
            name='SKU',
            field=models.ForeignKey(db_column='Id', null=True, on_delete=django.db.models.deletion.CASCADE,
                                    to='products.SKUTable', to_field='Id', verbose_name='ID do SKU'),
        ),
    ]

在此之后,我运行命令python manage.py migrate来保存这些更改。

迁移有效,我的管理员可以使用SKU访问数据SKU_idlist_display,但当我尝试以SKU_name或任何其他字段访问数据时,我收到此错误消息:

SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
<class 'cil.models.BasketTableAdmin'>: (admin.E108) The value of 'list_display[0]' refers to 'SKU_Name', which is not a callable, an attribute of 'BasketTableAdmin', or an attribute or method on 'cil.BasketTable'.

System check identified 1 issue (0 silenced).

我希望当我尝试使用list_display或模型中的任何其他get函数获取其他表字段时,有人可以明确我做错了什么。

我使用以下信息来到这里:

http://www.probthink.com/tech/converting-an-integer-id-field-to-foreign-key-field-without-data-migration/

https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey.to_field

修改1:

我稍微清理了一下代码。

我找到的一个可能的解决方案是不更改字段的名称而不使用db_column,而是使用to_field =&#39; destination_key_field&#39;。

SKU = models.ForeignKey(SKUTable, to_field='Id', null=True, verbose_name="ID do SKU")

使用此更改时,使用null = True非常重要。

0 个答案:

没有答案