使用 python 而不是 django shell

Posted

技术标签:

【中文标题】使用 python 而不是 django shell【英文标题】:use python instead of django shell 【发布时间】:2021-03-04 22:06:12 【问题描述】:

我有一个名为航空公司的基本项目,其中包含一个名为航班的应用程序。我创建了一个名为 Flight 的模型。

在一个名为 test.py 的文件中,我有:

from flights.models import Flight

f= Flight(origin="New York",destination="London", duration = 415)
f.save()

为了运行和更新数据库表,我应该把这个文件放在哪里? makemigrations 和 migrate 已成功运行。为了使代码运行,还需要做些什么吗?

【问题讨论】:

【参考方案1】:

您可以定义data migration [Django-doc]。这是您自己进行的迁移,例如添加/更新/删除数据。

您首先使用以下命令构建迁移文件:

python manage.py <b>makemigrations --empty</b> <i>flights</i>

接下来在迁移文件中,您可以定义一个函数来运行并创建Flight 对象:

from django.db import migrations

def add_flight(apps, schema_editor):
    Flight = apps.get_model('flights', 'Flight')
    Flight.objects.create(origin='New York', destination='London', duration=415)

class Migration(migrations.Migration):

    dependencies = [
        ('flights', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(add_flight),
    ]

我们使用apps.get_model('flights', 'Flight') 加载类。这将在迁移的那个时刻构建Flight 的Django 模型。例如,如果您稍后向您的 Flight 添加一个额外的字段,那么只要该迁移没有运行,Flight 就不会有该额外的字段。

【讨论】:

我想你可能误解了这个问题。我在 models.py 中创建了模型,运行了 makemigrations,然后运行了 migrate。在 django 框架中完成此操作后,我现在想向数据库添加一条记录 @DCR:是的。这正是您可以做的。由于您创建了额外的迁移,但不是更改数据库结构,而是添加/更新/删除数据。这就是 数据迁移 的用途。 Django 将因此检查数据库,发现它没有运行此数据迁移,运行它,从而将记录添加到表中。 哇,这看起来真的很令人费解。我正在寻找一种将许多(如 100,000 条)记录添加到数据库的方法。另外,您如何加载课程。我有 0002_auto_20201121_1951.py 文件,代码如图所示,但我该怎么办? @DCR:你运行迁移。 Django 将看到迁移没有运行,运行它,从而创建记录。 @DCR:对于大量记录,可以使用bulk_create:docs.djangoproject.com/en/dev/ref/models/querysets/#bulk_create

以上是关于使用 python 而不是 django shell的主要内容,如果未能解决你的问题,请参考以下文章

Django/Python - 用文字而不是数字显示月份

Python-如何刷新日志? (django)

python Django电子邮件身份验证而不是用户名

python django ajax:ValueError:视图没有返回 HttpResponse 对象。它返回 None 而不是

如何修复 Django:没有返回 HttpResponse 对象。它返回 None 而不是? [复制]

在 shell 脚本中使用 $() 而不是反引号有啥好处?