我有一个名为 UGC 的表,我想清除该表中的所有数据。我不想重置整个应用程序,这也会删除所有其他模型中的所有数据。是否可以只清除一个模型?如果有帮助的话,我还在我的应用程序中配置了 South。
您可以 使用原始 SQL :
cursor.execute(“DROP TABLE UGC”)
或者您可以直接在 Django shell 中使用 ORM:
UGCModel.objects.all().delete()
那会删除数据(但不是表格),所以你必须小心:)
另一种方法(为了完整性和使用 South)是在模型声明中注释掉模型,迁移然后再放回去(假设没有模型引用它。)
HTH
在管理界面中,您可以转到该模型的列表页面,然后您可以选择所有模型并使用表格顶部的
Delete selected ...
操作。
请记住,无论您以何种方式删除数据,外键默认为
ON DELETE CASCADE
,因此任何具有您要删除的模型的外键的模型也将被删除。管理界面将为您提供将要删除的模型的完整概览。
今天使用 django 2.0.2 遇到了这样的问题,因为我创建了我的模型
class Front(models.Model):
pass
并迁移了它但是当我后来更新模型时,我无法运行
python manage.py makemigrations
因为它在说
You are trying to add a non-nullable field 'update' to front without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows
with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option:
我的解决方案是什么?
Front
python manage.py makemigrations
删除了麻烦的表/模型python manage.py makemigrations
重新创建表/模型,最后python manage.py migrate
迁移了我的更改,一切都解决了!注意:小心上面的指令,因为它会删除表/模型的所有引用/外键,默认为
on_delete=models.CASCADE
!
Django 3.1.14
如果您有兴趣在命令行上执行此操作,并且您将经常对数据库进行这种类型的清理,我会这样做:
# project_name/app_name/management/commands/clear_test_models.py
from django.core.management.base import BaseCommand
from django.apps import apps
keep_models = ['KeepModel0', 'KeepModel1']
class Command(BaseCommand):
"""
clear all in app_name app except listed in keep_models list
"""
help = 'clear all models except those listed in keep_models list'
def handle(self, *args, **kwargs):
my_app = apps.get_app_config('app_name')
my_models = my_app.get_models()
for model in my_models:
if model.__name__ not in keep_models:
model.objects.all().delete()
在命令行上运行:
DJANGO_SETTINGS_MODULE=app_name.settings.local python manage.py clear_test_models
您可以使用 Django shell 执行此操作:
>>> py manage.py shell
>>> from [your_app].models import [Your_Model] as md
>>> md.objects.all().delete()
>>> exit()
记得将 [your_app] 替换为应用名称,将 [Your_Model] 替换为您要从数据库中清除的模型名称。
请记住,这将删除表中的数据,但不会删除表本身。如果你想做后者,你需要放下桌子。