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

2024-10-01 15:28:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从已有的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'),
                #
            )

Tags: andof数据对象djangoconfigmodels错误
2条回答

如果希望完全删除数据,则需要创建一个Django迁移(最好使用./manage.py makemigrations),该迁移将从数据库中删除这些列

或者,如果您想安全地保存旧数据,可以先将这些字段设置为可空,然后为它们创建迁移,最后要么不再使用它们,要么从模型中删除这些列,但不要在迁移中反映它们(如果您需要在此应用程序中运行另一次迁移,则需要在迁移中假装删除这些列)

因为似乎没有人知道答案,而且这个错误看起来是一个异常,所以我采用了非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

相关问题 更多 >

    热门问题