我正在一个项目中工作,我需要将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_id
和list_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函数获取其他表字段时,有人可以明确我做错了什么。
我使用以下信息来到这里:
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非常重要。