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

时间:2018-04-02 11:09:23

标签: django csv django-models django-forms

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

现在,我手头有一个excel文件,所有问题都在,我可以从那里制作一个CSV文件。我只需要在问题表中获取CSV数据。 什么可能是最简单的方法呢?任何人都可以告诉任何工具,流程,代码吗?

3 个答案:

答案 0 :(得分:1)

我使用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 :(得分:1)

Django management command可能是将此数据导入数据库的最佳选择。它允许您访问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 = 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 :(得分:0)

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

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

to_sql documentation