Django 2.0 使用脚本填充数据库

Posted

技术标签:

【中文标题】Django 2.0 使用脚本填充数据库【英文标题】:Django 2.0 Populating Database with a Script 【发布时间】:2018-12-16 02:00:12 【问题描述】:

我正在尝试使用脚本填充我的 Django 数据库,因此我不必手动输入数据。到目前为止,我有以下内容:

from my_app.models import ModelInApp
import django

django.setup()


def add_data(data1, data2):
    d, created = ModelInApp.objects.get_or_create(data1=data1, data2=data2)
    print("- Data: 0, Created: 1".format(str(d), str(created)))
    return d


def populate():
    # data is a list of lists
    for row in data:
        data1 = row[0]
        data2 = row[1]
        add_data(data1, data2)


if __name__ == "__main__":
    populate()

数据变量是一个列表列表,其中包含我要放入数据库的数据。问题是,当我运行脚本时,出现django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. 错误。我使用 PostgreSQL 作为数据库。

我做错了什么?

【问题讨论】:

【参考方案1】:

解决这个问题的快速方法是从 Django shell (python manage.py shell) 填充您的数据库。没有import djangodjango.setup() 的代码应该可以正常工作。又快又脏 ;)

如果您需要不时添加数据,请考虑写一个management command。这将允许您致电python manage.py my_command_name datafile.dat。您可以在命令中实现任何逻辑(来自文件或 API 的数据、创建或更新)。

另一种添加数据的方法是使用数据迁移:https://simpleisbetterthancomplex.com/tutorial/2017/09/26/how-to-create-django-data-migrations.html

另外,考虑使用bulk_create 来提高效率(之前过滤数据列表以避免重复)

【讨论】:

如果我想创建一个仪表板网络应用程序供内部使用怎么办?我不想手动更新可以通过 python shell 中的脚本检索的所有数据。我希望每当有人查看 URL 时自动添加数据。django 可以做到这一点吗? 您仍然需要更新 Django 数据库中的数据。一个好方法是编写一个自定义管理命令来更新数据并在您有更新(cron 作业?)docs.djangoproject.com/en/3.0/howto/custom-management-commands 时运行它。当数据库正常时,您的仪表板将始终显示更新的数据【参考方案2】:

我知道它就像永远一样,但是.. 虽然从技术上讲不是脚本,但 Django 通过创建 fixture 来允许数据库 seeding

文档非常直观。在 Django 中预填充数据库时,这始终是我的首选方法。例如,如果您有一个模型 Cars:

class Cars(models.Model):
    make = models.CharField(max_length=50)
    color = models.CharField(max_length=50)

您可以创建一个播种装置cars.json,例如:

[
  
    "model":"myapp.cars",
    "pk":1,
    "fields":
      "make": "Audi",
      "color":"Black"
    
  ,
  
    "model":"myapp.cars",
    "pk":2,
    "fields":
      "make": "Aston Martin",
      "color":"Blue"
    
  
]

要预填充数据库,只需运行 ./manage.py loaddata cars.json

我发现这是最好的选择,例如,如果您必须为您创建的每个 Web 应用程序在同一行中加载所有汽车型号或所有国家及其国旗或某事等数据...

【讨论】:

【参考方案3】:

我在运行填充脚本时遇到了类似的问题,即 django 核心异常。我通过添加代码解决了这个问题

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','my_django_project.settings')

import django
django.setup()

这里的my_django_project.settings 指向您项目的Python 包。如果您正在学习入门教程Writing your first Django app,则应阅读mysite.settings

您在示例中显示的代码应该如下所示,尽管您必须指定由问号指示的名称。

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','???.settings')

import django
django.setup()

from ???.models import ModelInApp

def add_data(data1, data2):
    d, created = ModelInApp.objects.get_or_create(data1=data1, data2=data2)
    print("- Data: 0, Created: 1".format(str(d), str(created)))
   return d


def populate():
    # data is a list of lists
    for row in data:
        data1 = row[0]
        data2 = row[1]
        add_data(data1, data2)


if __name__ == "__main__":
    populate()

【讨论】:

以上是关于Django 2.0 使用脚本填充数据库的主要内容,如果未能解决你的问题,请参考以下文章

从脚本填充数据库时出现 Django Heroku DataError

从外部脚本访问 django sqlite db

使用 SwiftUI 2.0 和 Core Data 预填充数据

用抓取的数据填充 django 模型

Django 2.0:sqlite IntegrityError:外键约束失败

Django 在模板中使用两个不同的数据集填充表