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

时间:2010-11-03 11:37:45

标签: python database django

我想编写一个Python脚本,将CSV文件的内容导入Django应用程序的数据库。因此,对于每个CSV记录,我创建了我的模型的实例,从解析的CSV行设置适当的值,并在模型实例上调用save。例如,见下文:

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

现在,假设名称Field在模型中标记为唯一。处理导入记录的名称值与数据库中已存在的名称值相同的最佳方法是什么?在致电保存之前我应该​​检查一下吗?怎么样?我应该抓一个例外吗?代码会是什么样的?

修改 如果数据库中已存在具有相同名称字段的记录,我仍希望更新其他字段。例如,如果我导入Fred,43并且已经有一个记录Fred,在db中有42个它应该将db更新为Fred,43。

修改 感谢所有的答案。 chefsmart指出的这种方法是我认为我会选择的方法:

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

4 个答案:

答案 0 :(得分:5)

我非常喜欢的Django orm功能之一是get_or_create()

所以我建议你这样做:

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

如果您想要更改person_record中的旧记录,或者检查记录是否已创建if created:,您可以在之后检查并使用它做任何您想做的事情。

希望这会有所帮助

答案 1 :(得分: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])

知道你偶然发现重复可能会更好。此外,您不依赖于模型是否正确编写或数据库是否支持唯一键等。

答案 2 :(得分:1)

请参阅此http://blog.roseman.org.uk/2010/03/9/easy-create-or-update/

我想它可以适应你的情况。

答案 3 :(得分:0)

抓住django.db.IntegrityError,我估计