如何安全地删除 Django 中的模型字段?

时间:2021-07-19 14:15:32

标签: python django

我需要从现有的 django 模型中删除已经有几个与之关联的对象的字段。从 models.py 中删除字段给了我一个错误(显然是因为仍有与它们关联的表列)。我的应用不需要 body2body3 中的数据。 我已将该数据从这些字段复制到 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)

我删除了 body2body3 并运行了迁移,在创建新对象时,我收到了这样的错误。

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'),
                #
            )

2 个答案:

答案 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