gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:29:07 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com