【问题标题】:Django migrate foreignkey with int index set to 10 digits not 11Django 迁移外键,int 索引设置为 10 位而不是 11
【发布时间】:2016-06-25 18:51:57
【问题描述】:

我有一个旧数据库,其 int 索引设置为 10 位。我需要 Django 迁移来创建 int(10) 而不是 int(11) 的外来键

默认情况下,Django Forigenkey 设置为 int(11),当尝试在 Mysql 中设置 ForigenKeys 时会报错:

django.db.utils.OperationalError: (1005, 'Can\'t create table `test_table`.`#sql-169_1ec` (errno: 150 "Foreign key constraint is incorrectly formed")')

我尝试在模型中使用“validators=[MaxValueValidator(9999999999)]”,它将迁移转换为:

    field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='clients.Customer', validators=[django.core.validators.MaxValueValidator(9999999999)]),

但是当 django 迁移创建它使用 int(11) 创建的整数字段时

知道如何修改 int 的长度吗?

我的模特:

class Customer(models.Model):
    ... (BUNCH OF FIELDS HERE)....
    django_user = models.ManyToManyField(User, through= 'CustomerUser')

    class Meta:
        db_table = 'customers'

class CustomerUser(models.Model):

    ROL_USUARIO = (
        ('T', 'Tecnico'),
        ('G', 'Gerente'),
        ('E', 'Emplead'),
    )

    cliente = models.ForeignKey(Customer, null= True, validators=[MaxValueValidator(9999999999)])
    usuario = models.ForeignKey(User, null= True)
    rol = models.CharField(choices=ROL_USUARIO, max_length = 1, null= True, default='')

迁移:

    migrations.CreateModel(
        name='CustomerUser',
        fields=[
            ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
            ('rol', models.CharField(choices=[('T', 'Tecnico'), ('G', 'Gerente'), ('E', 'Emplead')], default='', max_length=1, null=True)),
            **intentionally skipped**
            #('cliente', models.ForeignKey(null=True,on_delete=django.db.models.deletion.DO_NOTHING, to='clients.Customer')),
            #('usuario', models.ForeignKey(null=True,on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL)),
        ],
    ),



migrations.AddField(
            model_name='customeruser',
            name='cliente',
            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='clients.Customer', validators=[django.core.validators.MaxValueValidator(9999999999)]),
        ),

最后一个语句引发错误:“外键约束格式不正确”

【问题讨论】:

  • 您的模型和迁移看起来如何?

标签: python mysql django


【解决方案1】:

您可以选择使用int(10) 创建 forigenKey。通过编辑空的迁移文件。

首先创建一个空的迁移文件

python manage.py makemigrations --empty myapp

然后编辑operations = [] 用forigenKey int(10) 执行rawsql 你的新迁移文件:

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0009_auto_20160623_xxxxx'),
    ]

    operations = [
        migrations.RunSQL("ALTER TABLE myapp_table MODIFY field_id int(10);")
    ]

RunSQL 需要sqlparse

【讨论】:

  • 我不能做 ALTER TABLE,脚本在创建字段时会出现错误,但我可以用 RunSQL 附加字段并手动建立关系。我试试。
猜你喜欢
  • 1970-01-01
  • 2017-05-25
  • 2020-11-24
  • 2014-02-21
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多