将 CSV 文件导入 Django 模型的最简单方法是什么?

问题描述 投票:0回答:4

我正在 DJANGO 中制作一个应用程序来处理很多“问题”。模型中指定了一个问题表,或多或少会有数千个问题。

现在,我手头有一个 Excel 文件,其中包含所有问题,我可以从那里创建一个 CSV 文件。我只需要获取问题表中的 CSV 数据。 最简单的方法是什么?谁能告诉我有什么工具、流程、代码可以做到这一点吗?

django csv django-models django-forms
4个回答
11
投票

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

2
投票

我使用

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
方法供您使用,但我在这里没有使用过。


1
投票

带有“导入”按钮的 SQL 客户端似乎是显而易见的选择,例如用于 SQLite 的 SQLiteStudio 或用于 MySQL 的 MySQL Workbench。

但是,如果这不起作用,您也可以使用 pandas 库在一行中完成此操作:

pd.read_csv(filename).to_sql(tablename, con)

to_sql 文档


0
投票

您可以引用任何具有更多控制功能的包/模块(即管理控制、管理面板预览等)吗?

对于 2024 年阅读本文的任何人来说,最好的解决方案就是现在

django-import-export

它已经存在了十年,目前是 v4。 包括编程界面和管理 UI 集成。 文档齐全,并具有可扩展的定制界面。

© www.soinside.com 2019 - 2024. All rights reserved.