Django 2.0使用脚本填充数据库

时间:2018-07-07 23:27:17

标签: django database python-3.x automation django-2.0

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

TIMSK0|=(1<<OCIE0A);

data变量是包含我要放入数据库中的数据的列表的列表。问题是,当我运行脚本时,出现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() 错误。我正在使用PostgreSQL作为数据库。

我在做什么错了?

3 个答案:

答案 0 :(得分:6)

我知道它一直存在,但是..尽管从技术上讲不是脚本,但是Django通过创建seeding

来允许数据库fixture

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

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应用程序在同一行中加载所有车型,所有国家/地区及其标志或某物等数据,则这是最好的选择...

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

运行填充脚本时,我遇到了类似的问题,即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()