【问题标题】:Django: Import CSV file and handle clash of unique values correctlyDjango:导入 CSV 文件并正确处理唯一值的冲突
【发布时间】:2010-11-03 11:37:45
【问题描述】:

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

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

现在,假设名称字段在模型中被标记为唯一。处理正在导入的记录与数据库中已有记录具有相同名称值的情况的最佳方法是什么?在调用 save 之前我应该​​检查一下吗?如何?我应该捕获异常吗?代码会是什么样子?

编辑: 如果数据库中已经存在具有相同名称字段的记录,我仍然想更新其他字段。例如,如果我正在导入 Fred,43 并且数据库中已经有一条记录 Fred,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()

【问题讨论】:

  • 一个天真的解决方案是事先获取名称列表并检查:如果名称在 name_list:执行 save()。我不知道这是否是最好的。

标签: python database django


【解决方案1】:

我非常喜欢的 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: 并使用它做任何您想做的事情..

希望这会有所帮助

【讨论】:

  • 如果记录已经存在,但一些非唯一字段不同,它会更新吗?我是否必须调用诸如 person_record.save() 之类的方法?
  • 不,它不做更新就像方法的名称一样; 如果存在则获取或创建一个新记录,如果您想更新记录 get_or_create 如果它存在于我的答案中,则返回记录它是 var person_record所以你可以改变它并保存()
【解决方案2】:

看到这个http://blog.roseman.org.uk/2010/03/9/easy-create-or-update/

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

【讨论】:

    【解决方案3】:

    类似的东西:

    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])
    

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

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 我试过了,但是在捕捉到异常后它停止了:django.db.utils.DatabaseError: current transaction is aborted, commands ignored until end of transaction block
      • 当你捕获到 IntegrityError 时你会怎么做?扔掉你刚刚创建的包含重复的模型,是吗?如果是这样,也许你必须做一个 get_or_create
      猜你喜欢
      • 2015-04-22
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      相关资源
      最近更新 更多