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

3

我正在使用DJANGO制作一个涉及大量“问题”的应用程序。模型中指定了一个问题表,其中将有更多或更少的问题。

现在,我手头有一个包含所有问题的Excel文件,我可以从中制作CSV文件。我只需要将CSV数据导入我的问题表中。 有什么可能是最简单的方法来做到这一点?有人能告诉我任何工具、过程、代码吗?

3个回答

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

这是一个不错的想法,但我每次都需要指定要更新哪个模型...如果有很多模型需要定期更新,那将会很困难。你能推荐任何具有更多控制(即管理员控制、从管理员面板预览等)的包/模块吗? - Mohammad

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


做得很好。但是你能推荐任何带有更多控制的包/模块吗?(例如管理员控制、从管理员面板预览等)? - Mohammad
从我个人的经验来看,没有。但是如果你在谷歌上找到了什么,请在这里分享一下。 - MiniGunnR

1

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

但是,如果这不起作用,您也可以使用pandas库中的一行代码完成此操作: pd.read_csv(filename).to_sql(tablename, con)

to_sql文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接