使用django ORM对唯一列IntegrityError进行基本处理

时间:2014-07-25 16:29:50

标签: python django postgresql

我的django模型中有以下内容,我正在使用PostgresSql

class Business(models.Model):
    location = models.CharField(max_length=200,default="")
    name = models.CharField(max_length=200,default="",unique=True)

在我看来,我有:

def saveBusiness(bs):

    from ml1.models import Business

    for b in bs:
        p =Business(**b)
        p.save()

    return

当应用程序运行并遇到重复的列条目时,我不明白

IntegrityError ...duplicate key value violates unique constraint

我想让ORM根本不插入新记录并移动到下一条记录,如果该字段是重复的而没有崩溃。如何在django中最好地处理?

1 个答案:

答案 0 :(得分:0)

最简单的方法是简单地捕捉并忽略IntegrityError

for b in bs: 
    try:
        p = Business(**b)
        p.save()
    except IntegrityError:
        pass

但是,如果您正在使用交易,则必须谨慎。请参阅警告here

  

发生此类错误后,事务被破坏,Django将在原子块结束时执行回滚。如果您在回滚发生之前尝试运行数据库查询,Django将引发TransactionManagementError

因此,如果您正在使用事务,则需要将每个迭代包装在其自己的atomic()块中:

for b in bs: 
    try:
        with transaction.atomic():
            p = Business(**b)
            p.save()
    except IntegrityError:
        pass