当我尝试保存模型的实例时,我收到错误,因为外键中的数据类型错误,它说它必须是 bigint,但是主键是作为外键制作的模型的 charfiled。
我再次检查了主键,我尝试显式链接到该模型的名称字段
这是我的模型.py
class Department(models.Model):
name = models.CharField(max_length=50,primary_key=True)
building = models.ForeignKey(Building, on_delete=models.PROTECT)
class Purchase(models.Model):
invoice_no = models.CharField(max_length=30,primary_key=True)
date = models.DateField()
department = models.ForeignKey(Department, to_field='name', db_column='department_name', on_delete=models.PROTECT)
seller = models.CharField(max_length=100)
invendb=# \d inventory_purchase
Table "public.inventory_purchase"
Column | Type | Collation | Nullable | Default
-----------------+------------------------+-----------+----------+---------
invoice_no | character varying(30) | | not null |
date | date | | not null |
seller | character varying(100) | | not null |
department_name | bigint | | not null |
Indexes:
"inventory_purchase_invoice_no_2b78f964_pk" PRIMARY KEY, btree (invoice_no)
"inventory_purchase_department_id_28c8ef42" btree (department_name)
"inventory_purchase_invoice_no_2b78f964_like" btree (invoice_no varchar_pattern_ops)
听起来您遇到了一个问题,模型中的外键字段需要 bigint 类型,但相关模型的主键是 charfield。要解决此问题,您需要确保外键字段已正确配置以引用正确的类型。
您可以采取以下几个步骤来排查和解决问题:
检查外键定义: 验证模型中的外键字段是否已正确定义。需要设置引用相关模型,并且使用
to_field
参数来指定主键字段。
class YourModel(models.Model):
related_model = models.ForeignKey(RelatedModel, on_delete=models.CASCADE, to_field='name')
在此示例中,
RelatedModel
是您正在引用的模型,'name'
是RelatedModel
上用作主键的字段。
查看相关型号的主键: 确保相关模型上的主键字段 (
RelatedModel
) 确实是 CharField 并且具有正确的名称。
class RelatedModel(models.Model):
name = models.CharField(max_length=255, primary_key=True)
如果主键不是 CharField,则相应更新。
检查数据库架构: 对模型进行更改后,运行迁移以将这些更改应用到您的数据库架构。
python manage.py makemigrations
python manage.py migrate
验证数据库中的数据类型: 使用数据库管理工具或 Django 的
dbshell
检查数据库并验证外键和主键字段的数据类型是否匹配。
python manage.py dbshell
在数据库中,检查相关字段的类型。
如果执行这些步骤后问题仍然存在,请考虑共享模型定义的相关部分以及您遇到的错误的回溯,以获得更具体的帮助。此外,请仔细检查序列化过程,以确保在创建或更新模型实例时发送正确的数据类型。
使用
访问数据库外壳python manage.py dbshell
然后手动更改数据类型
ALTER TABLE your_table_name
ALTER COLUMN your_column_name
TYPE VARCHAR(30);