我有一个简单的模型。此表中的数据库中有几个条目。而且,它们的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))
我有以下限制:
- 不应删除博客应用的
migration
目录。 category
键应指向具有相同title
等于其自身的类别对象。如果类别对象被删除,则指向该对象的文章的类别字段应变为 null。
这是我的问题:
当我表演migrate
时,姜戈说
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: The row in 主键为"1"的表 'blog_article' 具有无效的外键: blog_article.category_id 包含一个值 'calculus' 不 在 blog_category.id 中具有相应的值。
将模型字段更改为指向包含某些数据的现有表的外键的正确方法是什么?
** 这是一个解决方案 - 如果您不关心目标表中的现有数据,请按照以下步骤操作,这肯定会解决您的问题**
- 注释要更改的字段。
- 如果您为该模型创建了表单,请在表单中注释掉您的目标字段名称。
- 进行迁移。这将删除您的目标字段。
- 请迁移。(如果收到错误,请在数据库模型中删除该字段,并添加具有相同名称的字段。这将解决迁移错误)。 现在我们已经从本地和数据库中删除了目标字段。
- 在模型中添加所需的外键字段。
- 进行迁移。(在执行此操作时,您必须给出一个默认值,请确保您给定的 id 存在于外键表中。
- 请迁移。
您可以使用to_field
指向类别对象
class Article(models.Model):
title = models.CharField(max_length=100)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, to_field='title')
在此to_field='title'
字符串"title"用作外键字段,以指向类别模型的字段"title"。
根据 Django 文档,我认为在两个模型的元数据中将托管选项设置为 False 可以帮助您。