Django get_or_create在导入CSV时返回models.DoesNotExist

时间:2017-03-30 10:07:05

标签: python django csv

我花了很长时间来弄明白这一点。我只是尝试使用Python的csv模块和Django的get_or_create()来导入CSV文件。

这是我的简单代码(基于this代码构建):

import csv
from .models import Person

def import_data():
    with open('/path/to/csv/people_list.csv') as f:
           reader = csv.reader(f)
           for row in reader:
               _, created = Org.objects.get_or_create(
                   name=row[0],
                   p_id=row[1],
                   current_status=row[2],
                   )

我在shell上运行import_data()时出现以下错误

peoplelisting.models.DoesNotExist: Person matching query does not exist.

是的,这个特殊的人不存在但不是使用get_or_create()的全部意义吗?如果它不存在,创建它吗?

2 个答案:

答案 0 :(得分:0)

经过大量的游戏,终于想到了问题如下:

我的csv还包含一个我没有忽略的标题行。我认为只有在我将csv导入工作之后我才会继续吃饭并忽略标题但是标题本身就是在创建问题(感谢this帖子(间接)帮了很多)。标头中的值与架构(max_length等)不匹配,这就是Person matching query does not exist所指的内容。忽略标题使它工作。我只是希望错误信息更具描述性。希望它可以帮助别人节省我花在调试简单事情上的时间。这是正确的代码:

import csv
from .models import Person

def import_data():
    with open('/path/to/csv/people_list.csv') as f:
           reader = csv.reader(f)
           for row in reader:
              if row[0] != 'Person_name': #where Person_name is first column's name
                 _, created = Org.objects.get_or_create(
                     name=row[0],
                     p_id=row[1],
                     current_status=row[2],
                     )

答案 1 :(得分:0)

不必每次都检查row [0],只需跳过第一行:

next(reader, None)  # skip the headers

来源: Skip the headers when editing a csv file using Python