清空一张桌子并填充固定装置

时间:2017-09-04 13:01:21

标签: django python-3.x django-migrations

我正在开展一个大型项目(已经存在大量的迁移等等),而且我必须清空整个桌子,然后再用~10填充它元素。 Django解决这种情况的方法是什么?赛程? RunPython

1 个答案:

答案 0 :(得分:1)

从表中删除数据(Django)

默认的Django生成的迁移与填充表无关。默认迁移会更改数据库布局,例如创建或删除表,添加列,更改列的参数等。(直到最后阅读如何使用手动迁移来删除表中的数据!)

删除数据

您要做的是删除表格中的条目而不删除整个表格。当然,您可以从models.py中删除该表,然后迁移将删除该表(如果没有错误,请阅读下一页),但这可能会导致不必要的行为和错误(例如,其他模型具有ForeignKey s到这个表可能会阻止你删除表)。您有两种选择:

  1. 手动连接数据库并运行

    DELETE * FROM your_table;
    
  2. 使用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()
    
  3. 从包含手动迁移文件的表中删除数据

    如果您想将其创建为迁移,则可以自行编写迁移文件。为了确保一切顺利,请运行

    python manage.py makemigrations
    python manage.py migrate
    

    首先,迁移可能在两者之间完成的任何更改。现在,创建您的虚假迁移文件,如下所示:

    • 如果上次迁移的编号为0180,请将文件命名为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 !! )。