Django:导入CSV文件并正确处理唯一值冲突

1 投票
3 回答
1242 浏览
提问于 2025-04-16 06:29

我想写一个Python脚本,把CSV文件里的内容导入到Django应用的数据库中。对于每一条CSV记录,我会创建一个模型的实例,从解析出来的CSV行中设置合适的值,然后调用模型实例的保存方法。比如,下面这个例子:

for row in dataReader:
    person=Person()
    person.name=row[0]
    person.age=row[1]
    person.save()

现在,假设模型中的名字字段被标记为唯一的。那么,当导入的记录有一个名字和数据库中已有的记录相同的时候,应该怎么处理呢?我应该在调用保存之前检查一下吗?怎么检查?还是说应该捕获一个异常?代码应该怎么写呢?

补充: 如果数据库中已经有一条记录的名字字段和要导入的记录相同,我还是想更新其他字段。比如,如果我导入的是Fred,43,而数据库中已经有一条记录是Fred,42,那么应该把数据库更新为Fred,43。

补充: 感谢大家的回答。这个方法,chefsmart提到的,是我觉得我会采用的:

try:
    obj = Person.objects.get(name=name)
except Person.DoesNotExist:
    obj = Person()
    obj.name = name
obj.age = age
obj.save()

3 个回答

0

我想你应该捕捉一下这个 django.db.IntegrityError 错误。

1

大概是这样的:

for row in dataReader:
    try:
       Person.objects.get(name=row[0])
       #write some errlog here possibly or update the model
    except Person.DoesNotExist:
       Person.object.create(name=row[0],age=row[1])

知道你遇到的是重复的内容可能会更好。这样你就不需要依赖模型是否写得正确,或者数据库是否支持唯一键之类的东西。

5

我非常喜欢Django的一个函数,叫做 get_or_create()

所以我建议你可以这样做:

for row in dataReader:
    person_record, created = person.get_or_create(name=row[0], age=row[1])

你可以在之后检查一下,看看是否想要更改旧的记录 person_record,或者检查一下记录是否是新创建的 if created:,然后随便对它做你想做的事情……

希望这对你有帮助

撰写回答