Django解决ForeignKey引用外键时类型不匹配问题

**

Django解决ForeignKey引用外键时类型不匹配问题(3780)

**

方法一:

**
**

1.报错的代码:

File "F:\pychrom_python\web\django\venv\meiduo_project_venv\lib\site-packages\pymysql\err.py", line 143, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.OperationalError: (3780, "Referencing column 'xxx' and referenced column 'xxx' in foreign key constraint 'xxxx' are incompatible.")

2.报错的原因:

在一个模型中使用field_name=models.ForeignKey(‘models_name’)去创建一个外键字段的时候,在迁移模型的时候,django会在数据库表中创建一个field_name_id的字段,而该字段的类型与引用其他表中的主键的类型不匹配,所有在迁移的时候django会raise 3780出来.

3.查看当前迁移文件时生成的sql命令

使用终端中使用python manage.py sqlmigrate <app_name> <migration>查看当前迁移文件所产生的sql语句

在这里插入图片描述当前迁移创建的外键字段类型为bigint,而我这里引用表中的主键的类型为int。

4.解决方法:

找到当前的迁移文件
在这里插入图片描述

class Migration(migrations.Migration):

    dependencies = [
        ('goods', '0003_rename_default_image_url_sku_default_image'),
    ]

    operations = [
        migrations.CreateModel(
            name='GoodsVisitCount',
            fields=[
                ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
                ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
                ('id', models.AutoField(primary_key=True, serialize=False, unique=True, verbose_name='主键')),
                ('count', models.IntegerField(default=0, verbose_name='访问量')),
                ('date', models.DateField(auto_now_add=True, verbose_name='统计日期')),
                ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='goods.goodscategory', verbose_name='商品分类')),
            ],
            options={
                'verbose_name': '统计分类商品访问量',
                'verbose_name_plural': '统计分类商品访问量',
                'db_table': 'tb_goods_visit',
            },
        ),
    ]

这里是通过migrations.CreateModel方法创建表,而django通过models.ForeignKey()创建外键,默认的类型为bigint,删除当前迁移文件migrations.CreateModel()方法的代码,改为通过migrations.runsql方法的sql语句的形式创建表,如下:

class Migration(migrations.Migration):

    dependencies = [
        ('goods', '0003_rename_default_image_url_sku_default_image'),
    ]

    operations = [

        migrations.RunSQL(
            """
            CREATE TABLE tb_goods_visit(
            create_time datetime(6) NOT NULL,
            update_time datetime(6) NOT NULL, 
            id integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
            count integer NOT NULL, 
            date date NOT NULL, 
            category_id int NOT NULL,
            CONSTRAINT tb_goods_visit_category_id_b3e36237_fk_tb_goods_category_id FOREIGN KEY(category_id) REFERENCES tb_goods_category(id)
             );
            """
    )
    ]

执行python manage.py migrate 命令

(meiduo_project_venv) F:\pychrom_python\web\django\meiduo_project\meiduo>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, areas, auth, contents, contenttypes, goods, oauth, sessions, users
Running migrations:
  Applying goods.0004_goodsvisitcount... OK

5.测试:

>>>(meiduo_project_venv) F:\pychrom_python\web\django\meiduo_project\meiduo>python manage.py shell
>>> from goods.models import GoodsVisitCount
>>> a=GoodsVisitCount.objects.get(id=1)
>>> a.category
<GoodsCategory: 相机>
>>> a.category.name
'相机'


成功关联表查询出记录

**

方法二:

**
通过更改配置文件下的DEFAULT_AUTO_FIELD配置

在这里插入图片描述
对于我上面的出现的问题,可以删除子应用下对应的迁移文件,删除数据库迁移表中对应的迁移记录,重新生成迁

移文件,重新迁移表到数据库即可,并且配置更改为:DEFAULT_AUTO_FIELD=django.db.models.IntegerField

相关更多说明可以查看https://docs.djangoproject.com/zh-hans/4.0/ref/settings/django官方文档中DEFAULT_AUTO_FIELD的配置说明。

到此結束,感謝閲讀~~~~~~~~~~~~~
小白自学,各路神仙勿喷

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值