Как изменить поле модели на внешний ключ с существующими таблицами

У меня есть простая модель. Эта таблица имеет несколько записей в базе данных. И, поле category в них не пусто:

# blog.models.py

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    category = models.CharField(max_length=50)

Я хочу изменить поле category на внешний ключ. Таблица category создается следующим образом, и эти поля изменяются на внешние ключи:

# blog.models.py

from django.db import models
from account.models import User

class Category(models.Model):
    title = models.CharField(max_length=50)
    
    def __str__(self):
        return self.title
        

class Article(models.Model):
    title = models.CharField(max_length=100)
    
    # category = models.CharField(max_length=50)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, 
                             null=True, blank=True, 
                             default=Category.objects.get(title=title))

У меня есть такие ограничения:

  1. the migration directory of the blog app shouldn't be deleted.
  2. the category key should point to a category object that has the same title equal to its own. If a category object gets deleted, the category field of articles pointing to it should become null.

Вот моя проблема:

Когда я выполняю migrate, django говорит

raise self.model.DoesNotExist( blog.models.Category.DoesNotExist: Категория, соответствующая запросу, не существует.

Это происходит потому, что у меня есть несколько статей. Но таблица категорий пуста. Поэтому Django не находит ни одного объекта категории, на который можно было бы указать существующим статьям.

Я пытался удалить значение по умолчанию поля category:

category = models.ForeignKey(Category, on_delete=models.SET_NULL, 
                                 null=True, blank=True )

Но, migrate выдает такую ошибку:

raise IntegrityError( django.db.utils.IntegrityError: Строка в таблице 'blog_article' с первичным ключом '1' имеет недопустимый внешний ключ: blog_article.category_id содержит значение 'Calculus', которое не соответствующего значения в blog_category.id.

.

Каков правильный способ преобразования поля модели во внешний ключ, который указывает на существующую таблицу, содержащую некоторые данные.

Я думаю, что установка опции managed в False в метаданных двух моделей может помочь вам, согласно документу Django.

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