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", чтобы вы могли оставить его пустым при создании или во время миграции.

Вернуться на верх