将外键数据类型从bigint更改为string

问题描述 投票:0回答:2

当我尝试保存模型的实例时,我收到错误,因为外键中的数据类型错误,它说它必须是 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)
django django-rest-framework django-serializer
2个回答
0
投票

听起来您遇到了一个问题,模型中的外键字段需要 bigint 类型,但相关模型的主键是 charfield。要解决此问题,您需要确保外键字段已正确配置以引用正确的类型。

您可以采取以下几个步骤来排查和解决问题:

  1. 检查外键定义: 验证模型中的外键字段是否已正确定义。需要设置引用相关模型,并且使用

    to_field
    参数来指定主键字段。

    class YourModel(models.Model):
        related_model = models.ForeignKey(RelatedModel, on_delete=models.CASCADE, to_field='name')
    

    在此示例中,

    RelatedModel
    是您正在引用的模型,
    'name'
    RelatedModel
    上用作主键的字段。

  2. 查看相关型号的主键: 确保相关模型上的主键字段 (

    RelatedModel
    ) 确实是 CharField 并且具有正确的名称。

    class RelatedModel(models.Model):
        name = models.CharField(max_length=255, primary_key=True)
    

    如果主键不是 CharField,则相应更新。

  3. 检查数据库架构: 对模型进行更改后,运行迁移以将这些更改应用到您的数据库架构。

    python manage.py makemigrations
    python manage.py migrate
    
  4. 验证数据库中的数据类型: 使用数据库管理工具或 Django 的

    dbshell
    检查数据库并验证外键和主键字段的数据类型是否匹配。

    python manage.py dbshell
    

    在数据库中,检查相关字段的类型。

如果执行这些步骤后问题仍然存在,请考虑共享模型定义的相关部分以及您遇到的错误的回溯,以获得更具体的帮助。此外,请仔细检查序列化过程,以确保在创建或更新模型实例时发送正确的数据类型。


0
投票

使用

访问数据库外壳
python manage.py dbshell 

然后手动更改数据类型

ALTER TABLE your_table_name
ALTER COLUMN your_column_name
TYPE VARCHAR(30); 
© www.soinside.com 2019 - 2024. All rights reserved.