我正在 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 客户端似乎是显而易见的选择,例如用于 SQLite 的 SQLiteStudio 或用于 MySQL 的 MySQL Workbench。
但是,如果这不起作用,您也可以使用 pandas 库在一行中完成此操作:
pd.read_csv(filename).to_sql(tablename, con)
您可以引用任何具有更多控制功能的包/模块(即管理控制、管理面板预览等)吗?
对于 2024 年阅读本文的任何人来说,最好的解决方案就是现在
django-import-export
。
它已经存在了十年,目前是 v4。 包括编程界面和管理 UI 集成。 文档齐全,并具有可扩展的定制界面。