Django ORM中唯一列IntegrityError的基本处理

0 投票
1 回答
576 浏览
提问于 2025-04-18 14:46

我在我的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

最简单的方法就是捕捉并忽略这个IntegrityError错误:

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

不过,如果你在使用事务的时候要小心。你可以在这里看到相关的警告:

一旦出现这样的错误,事务就会中断,Django会在原子块结束时进行回滚。如果你在回滚发生之前尝试运行数据库查询,Django会抛出一个TransactionManagementError错误。

所以如果你在使用事务的话,需要把每次操作都放在自己的atomic()块里:

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

撰写回答