python - django.db.utils.IntegrityError : The row in table 'main_page_projects' with primary key '1' has an invalid foreign key 错误

标签 python sql django sqlite

创建第一个项目模型并用一些数据填充它,然后尝试通过外键向它添加配置文件模型(那里没有数据),同时尝试进行迁移以将配置文件模型与项目模型链接起来时出现错误:

django.db.utils.IntegrityError:主键为“1”的表“main_page_projects”中的行具有无效外键:main_page_projects.profile_id 包含值“1”,该值在main_page_profile.id。

在 makemigration 期间选择了值 nr 1:

如果不指定默认值,就不可能向项目添加不可为 null 的字段“配置文件”。这是因为数据库需要一些东西来填充现有的行。 请选择一个修复: 1) 现在提供一次性默认值(将在所有现有行上设置此列的空值) 2) 退出并在 models.py 中手动定义一个默认值。

我四处搜索并查看了 stackoverflow,可能如果我删除了迁移文件和 sqlite3 数据库,那么迁移应该可以工作,但我想知道如何在不删除迁移文件和数据库的情况下使其工作。如果填充配置文件,则迁移也有效,但为什么它不会创建具有默认值的链接?

我应该做些什么不同的事情或哪里出错了?

使用 Django 4.0.2 和 Python 3.9.5

模型.py

from django.db import models

class Profile(models.Model):
    full_name = models.CharField(max_length=50, verbose_name='Name')
    email = models.EmailField(unique=True, verbose_name='Email')
    bio = models.TextField(max_length=500, verbose_name='Description')
    profile_picture = models.ImageField(upload_to='profile_picture')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Profile'
        verbose_name_plural = 'Profiles'


class Projects(models.Model):
    name = models.CharField(max_length=50, unique=True, verbose_name='Name')
    slug = models.SlugField(unique=True)
    tech = models.CharField(max_length=50)
    description = models.TextField(max_length=500, verbose_name='Description')
    image = models.ImageField(upload_to='portfolio/')
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)


    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Project'
        verbose_name_plural = 'Projects'

项目迁移和配置文件迁移代码

项目迁移

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Projects',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=50, unique=True, verbose_name='Name')),
                ('slug', models.SlugField(unique=True)),
                ('tech', models.CharField(max_length=50)),
                ('description', models.TextField(max_length=150, verbose_name='Description')),
                ('image', models.ImageField(upload_to='portfolio/')),
            ],
        ),
    ]

配置文件迁移


from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('main_page', '0003_projects_image'),
    ]

    operations = [
        migrations.CreateModel(
            name='Profile',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('full_name', models.CharField(max_length=50, verbose_name='Name')),
                ('email', models.EmailField(max_length=254, unique=True, verbose_name='Email')),
                ('bio', models.TextField(max_length=500, verbose_name='Description')),
                ('profile_picture', models.ImageField(upload_to='profile_picture')),
            ],
            options={
                'verbose_name': 'Profile',
                'verbose_name_plural': 'Profiles',
            },
        ),
    ]

外键关系迁移

# Generated by Django 4.0.2 on 2022-02-11 08:05

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    dependencies = [
        ('main_page', '0004_profile'),
    ]

    operations = [
        migrations.AddField(
            model_name='projects',
            name='profile',
            field=models.ForeignKey(default='1', on_delete=django.db.models.deletion.CASCADE, to='main_page.profile'),
            preserve_default=False,
        ),
    ]

最佳答案

您不能在数据库表中创建一个条目(或通过迁移添加一个字段来修改一个条目),其外键指向目标表上不存在的条目(在您的情况下为“配置文件”)。它没有意义 - 所以你会得到完整性错误。 保留 default=1 并将其设置为“blank=True, null=True”,这样您就可以在创建或迁移期间将其留空。

关于python - django.db.utils.IntegrityError : The row in table 'main_page_projects' with primary key '1' has an invalid foreign key 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71083957/

相关文章:

python - 通过 FFI 调用 Rust 函数时发生访问冲突

python - 如何拦截 GTK 主循环,或者使用 python gtk 为主函数设置回调事件?

Python:matplotlib 和 seaborn 之间共享比例

sql - 如何在 "and"子句中​​使用 "or"和 "Where"

sql - 通过具有日期范围的 Access 查询来限制组

sql - 删除作为另一个表的外键的主键行

python - 在 Django 中,如何将 Request.response 重新打包为 Django 响应?

命令中的 python 变量与 os.system 一起执行

python - 一个基于类的 View 对象用于多个 url,具体取决于参数

python - django heroku 服务器错误