Django.db.utils.IntegrityError: Строка в таблице 'main_page_projects' с первичным ключом '1' имеет недопустимый внешний ключ
Создал первую модель проекта и заполнил ее некоторыми данными, затем попытался добавить к ней модель профиля (там нет данных) через внешний ключ и при попытке выполнить миграцию для связывания модели профиля с моделью проекта получил ошибку:
django.db.utils.IntegrityError: Строка в таблице 'main_page_projects' с первичным ключом '1' имеет недопустимый внешний ключ: main_page_projects.profile_id содержит значение '1', которое не имеет соответствующего значения в main_page_profile.id.
Значение № 1 было выбрано во время makemigration:
Невозможно добавить в проекты ненулевое поле 'profile' без указания значения по умолчанию. Это происходит потому, что базе данных нужно чем-то заполнить существующие строки. Пожалуйста, выберите исправление: 1) Предоставить одноразовое значение по умолчанию сейчас (будет установлено для всех существующих строк с нулевым значением для этого столбца) 2) Выйти и вручную определить значение по умолчанию в models.py.
Я погуглил и посмотрел также stackoverflow, возможно, если я удалю файлы миграции и базу данных sqlite3, то миграции должны работать, но я хотел бы знать, как заставить их работать без удаления файлов миграции и базы данных. Если заполнить профиль, то миграция также работает, но почему она не создает ссылку со значениями по умолчанию?
Что я должен делать по-другому или где я ошибся?
Используется Django 4.0.2 и Python 3.9.5
models.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,
),
]
Вы не можете создать запись в таблице базы данных (или изменить ее, добавив поле с помощью миграций) с внешним ключом, который указывает на несуществующую запись в целевой таблице ("Profile" в вашем случае). Это не имеет смысла - поэтому вы получаете ошибку целостности. Уберите default=1 и сделайте его "blank=True, null=True", чтобы вы могли оставить его пустым при создании или во время миграции.