我需要从现有的 django 模型中删除已经有几个与之关联的对象的字段。从 models.py
中删除字段给了我一个错误(显然是因为仍有与它们关联的表列)。我的应用不需要 body2
和 body3
中的数据。
我已将该数据从这些字段复制到 body
字段。我如何在不完全删除表格的情况下删除这些字段?
class Post(models.Model):
#some fields
body =EditorJsField(editorjs_config=editorjs_config)
body2 =EditorJsField(editorjs_config=editorjs_config)
body3 =EditorJsField(editorjs_config=editorjs_config)
我删除了 body2
和 body3
并运行了迁移,在创建新对象时,我收到了这样的错误。
django.db.utils.IntegrityError: null value in column "body2" of relation "second_posts" violates not-null constraint
DETAIL: Failing row contains (20, Wave | Deceptiveness, and unpredictability of nature, 2021-07-19 13:40:32.274815+00, 2021-07-19 13:40:32.274815+00, {"time":1626702023175,"blocks":[{"type":"paragraph","data":{"tex..., null, null, Just how unpredictable is nature? Nature is all around us, yet, ..., image/upload/v1626702035/dfaormaooiaa8felspqd.jpg, wave--deceptiveness-and-unpredictability-of-nature, #66c77c, l, 1, 1, 0).
这是我用来保存清理数据的代码(当然是在我删除了这些字段之后。)
post = Posts.objects.create(
body=form.cleaned_data.get('body'),
#
)
答案 0 :(得分:0)
如果您想完全删除数据,您需要创建一个 Django 迁移(最好使用 ./manage.py makemigrations
)来从数据库中删除这些列。
或者,如果您想安全操作并保留旧数据,您可以先将这些字段设为可空,然后为它们创建迁移,最后要么不再使用它们,要么从模型中删除这些列,但不要在迁移中反映它(如果您需要在此应用中运行另一个迁移,则需要在迁移中伪造这些列的删除)。
答案 1 :(得分:0)
由于似乎没有人有答案,而且由于这个错误看起来是一个异常,所以我采用了非 Python 方式运行 SQL 查询并删除了列。对于那些遇到同样问题的人,
首先,让 Django 意识到这些变化
删除您要删除的字段并运行迁移。
之前
class Post(models.Model):
#some fields
body =EditorJsField(editorjs_config=editorjs_config)
body2 =EditorJsField(editorjs_config=editorjs_config)
body3 =EditorJsField(editorjs_config=editorjs_config)
之后
class Post(models.Model):
#some fields
body =EditorJsField(editorjs_config=editorjs_config)
命令提示符
python manage.py makemigrations
python manage.py migrate
使用 SQL 查询删除列
首先连接到您的数据库(我使用了 postgres)。表的名称应该类似于 appname_model
。我的应用程序被称为“Second”,模型是 Post。因此,该表被称为 second_post
。
查看迁移后列是否仍然存在,
在 SQL 命令提示符中
/d second_post
这应该会为您提供一个漂亮的数据库图表,所有列都列在左侧。要删除这些列,请键入
ALTER TABLE second_post DROP COLUMN body2;
ALTER TABLE second_post DROP COLUMN body3;
输入每个查询后,如果成功,提示应返回一个字符串 ALTER TABLE
。