我正在开展一个大型项目(已经存在大量的迁移等等),而且我必须清空整个桌子,然后再用~10填充它元素。 Django解决这种情况的方法是什么?赛程? RunPython
?
答案 0 :(得分:1)
默认的Django生成的迁移与填充表无关。默认迁移会更改数据库布局,例如创建或删除表,添加列,更改列的参数等。(直到最后阅读如何使用手动迁移来删除表中的数据!)
您要做的是删除表格中的条目而不删除整个表格。当然,您可以从models.py
中删除该表,然后迁移将删除该表(如果没有错误,请阅读下一页),但这可能会导致不必要的行为和错误(例如,其他模型具有ForeignKey
s到这个表可能会阻止你删除表)。您有两种选择:
手动连接数据库并运行
DELETE * FROM your_table;
使用Python为您完成工作。您可以通过执行python manage.py shell
来打开Django shell。然后,您必须导入模型并运行.delete()
。这看起来像这样:
$ python manage.py shell
# We are in Django Python shell now...
>> from app.models import Model_to_empty
>> Model_to_empty.objects.all().delete()
如果您想将其创建为迁移,则可以自行编写迁移文件。为了确保一切顺利,请运行
python manage.py makemigrations
python manage.py migrate
首先,迁移可能在两者之间完成的任何更改。现在,创建您的虚假迁移文件,如下所示:
0181_manual_deletion_through_migration.py
,并将其放入app/migrations
,其中app
是包含需要清空和重新填充的模型的应用您可以在迁移中使用migrations.RunSQL
类,这将在迁移时执行作为参数给出的语句。
从我的一个项目中获取的示例迁移文件是:
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('beer', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='beer',
name='beer_type',
field=models.CharField(default=0, max_length=30),
preserve_default=False,
),
]
让我们分解一下:
dependencies = [
('beer', '0001_initial'),
]
这描述了之前改变模型的迁移。 'beer'
是应用的名称,'0001_initial'
是以前的迁移。将此项设置为要从中删除条目的模型名称,迁移名称应为最后一次迁移。
operations = [
migrations.AddField(
model_name='beer',
name='beer_type',
field=models.CharField(default=0, max_length=30),
preserve_default=False,
),
]
operations
内部需要做些什么。在我的示例中,它添加了一个字段,因此migrations.AddField
。记得我跟你说过migrations.RunSQL
?好吧,我们可以像这样使用它:
operations = [
migrations.RunSQL("DELETE * FROM your_model;"),
# run SQL statements to populate your model again.
]
您可以在其中放置SQL语句而不是注释,这些SQL语句将使用您想要的条目填充表。
完成虚假迁移文件的编辑后,只需执行python manage.py migrate
( NO python manage.py makemigrations
!! )。