Как изменить поле модели на внешний ключ с существующими таблицами
У меня есть простая модель. Эта таблица имеет несколько записей в базе данных. И, поле 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))
У меня есть такие ограничения:
- the
migration
directory of the blog app shouldn't be deleted. - the
category
key should point to a category object that has the sametitle
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.