Django:导入CSV文件并正确处理唯一值冲突
我想写一个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:
,然后随便对它做你想做的事情……
希望这对你有帮助