Django 2.0 使用脚本填充数据库
Django 2.0 Populating Database with a Script
我正在尝试使用脚本填充我的 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 作为数据库。
我做错了什么?
解决这个问题的快速方法是从 Django shell (python manage.py shell
) 填充您的数据库。没有 import django
和 django.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
提高效率(之前过滤数据列表以避免重复)
我在 运行 填充脚本时遇到了类似的问题,即 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 允许数据库 seeding by creating a fixture
文档非常直观。在 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 应用程序在同一行中加载所有车型或所有国家/地区及其旗帜或其他数据...
我正在尝试使用脚本填充我的 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 作为数据库。
我做错了什么?
解决这个问题的快速方法是从 Django shell (python manage.py shell
) 填充您的数据库。没有 import django
和 django.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
提高效率(之前过滤数据列表以避免重复)
我在 运行 填充脚本时遇到了类似的问题,即 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 允许数据库 seeding by creating a fixture
文档非常直观。在 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 应用程序在同一行中加载所有车型或所有国家/地区及其旗帜或其他数据...