首页 > 解决方案 > 将 CSV 数据导入模型 - DJANGO

问题描述

我正在实施客户列表。我想为用户提供导入新客户的可能性,例如 csv 文件。客户端模型具有以下字段:客户端、姓名、姓氏、电子邮件、电话

所以我创建了这个模型:

class CsvClient(models.Model):
file_name = models.FileField(upload_to='csv-cliente')
uploaded = models.DateTimeField(auto_now_add=True)
activated = models.BooleanField(default=False)

def __str__(self):
    return f"File id: {self.id}"

和views.py中的这个函数:

import csv

def importa_csv_clienti(request):
form = CVSForm(request.POST or None, request.FILES or None)

if form.is_valid():
    form.save()
    form = CVSForm()
    clients = CsvClient.objects.get(activated=False)
    with open(clienti.file_name.path, 'r') as f:
        reader = csv.reader(f)

        for i, row in enumerate(reader):
            if i==0:
                pass
            else:
                row = "".join(row)
                row = row.replace(";", " ")
                row = row.split(" ")

                client = row[0].capitalize()
                name = row[1].capitalize()
                surname = row[2].capitalize()

                value = Cliente.objects.create(
                    cliente=cliente,
                    nome=nome,
                    cognome=cognome,
                    email=riga[3],
                    telefono=riga[4],
                )

                print('oggetto creato:', value.cliente, value.nome, value.cognome, value.email, value.telefono)

        clients.activated = True
        clients.save()

context = {'form': form}
template = 'importa.html'
return render(request, template, context)

它可以工作,期待这样一个事实,如果在 csv 文件中我有行:

Nutella Antonio Dello Iudice

nutella 是客户 Antonio 是姓名 Dello Iodice 是姓氏,电子邮件和电话为空白

基本上,它将其解释为 Dello 是姓氏而 Iudice 是电子邮件。

如果姓氏由2个或多个单词组成,我如何告诉他不要分开姓氏?

PS:这是一个好奇心,但是我怎么知道用户导入的 csv 文件是否用 ; 分隔 并不是 , ?因为我设置为分隔符“;”,但是如果用户导入一个以“,”分隔的文件,我的代码将无法正常工作,对吗?

标签: djangocsvdjango-modelsimportpython-import

解决方案


现在你正在替换“;” 由一个空格。所以一行 likeNutella;Antonio Dello; Iudice将被转换为Nutella Antonio Dello Iudice.

在此替换之后,您对空格进行拆分。

为什么不删除row = row.replace(";", " "),只是做row = row.split(";")


推荐阅读