我正在使用DJANGO制作一个涉及大量“问题”的应用程序。模型中指定了一个问题表,其中将有更多或更少的问题。
现在,我手头有一个包含所有问题的Excel文件,我可以从中制作CSV文件。我只需要将CSV数据导入我的问题表中。 有什么可能是最简单的方法来做到这一点?有人能告诉我任何工具、过程、代码吗?
我正在使用DJANGO制作一个涉及大量“问题”的应用程序。模型中指定了一个问题表,其中将有更多或更少的问题。
现在,我手头有一个包含所有问题的Excel文件,我可以从中制作CSV文件。我只需要将CSV数据导入我的问题表中。 有什么可能是最简单的方法来做到这一点?有人能告诉我任何工具、过程、代码吗?
对于将数据导入数据库,一个Django管理命令可能是最好的选择。它提供了访问Django ORM的功能,同时与请求/响应周期分离。您可以通过命令行并将.csv文件作为参数调用它。
以下是一个简单的示例。
import csv
from django.core.management import BaseCommand
from app.models import Question
class Command(BaseCommand):
help = 'Load a questions csv file into the database'
def add_arguments(self, parser):
parser.add_argument('--path', type=str)
def handle(self, *args, **kwargs):
path = kwargs['path']
with open(path, 'rt') as f:
reader = csv.reader(f, dialect='excel')
for row in reader:
Question.objects.create(
attr1=row[0],
attr2=row[1],
)
app/management/commands/load_questions.py
,则可以使用以下方式调用它:python manage.py load_questions --path /path/to/your/file.csv
我会使用 csv
模块来实现。以下是一个示例,展示如何创建大量用户。这可能不是最有效的方法,但它一定可以完成任务。
import csv
from django.contrib.auth.hashers import make_password
def create_bulk_user(request):
with open(os.path.join(settings.BASE_DIR, 'media', 'core', 'employees.csv')) as f:
reader = csv.reader(f)
for row in reader:
user, created = User.objects.get_or_create(
username=str(row[0]),
defaults={
'password': make_password('ddff123#'),
'first_name': ' '.join(row[1].split()[:-1]),
'last_name': str(row[1].split()[-1])
}
)
designation, created = Designation.objects.get_or_create(
name=str(row[4]), defaults={}
)
department, created = Department.objects.get_or_create(
name=str(row[3])
)
user.profile.designation = designation
user.profile.department = department
user.profile.proximity_id = str(row[2])
user.profile.save()
context = {}
return render(request, "core/create_bulk_user.html", context)
请记住,有一个bulk_create
方法可供使用,但我在这里没有使用它。
一个带有“导入”按钮的SQL客户端似乎是明显的选择,例如SQLiteStudio用于SQLite或MySQL Workbench用于MySQL。
但是,如果这不起作用,您也可以使用pandas库中的一行代码完成此操作:
pd.read_csv(filename).to_sql(tablename, con)