Django ORM中唯一列IntegrityError的基本处理
我在我的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