You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django:如何捕获数据库IntegrityError并处理唯一字段冲突

Django 唯一字段重复提交的处理方案

1. 捕获正确的异常类(解决当前问题)

你无法捕获异常是因为没有指定正确的异常类型,需要导入django.db.utils.IntegrityError并在except块中捕获它:

from django.db.utils import IntegrityError
from django.http import HttpResponse
from .models import UniquePerson

def add_person(request, name):
    try:
        person = UniquePerson.objects.create(name=name)
        return HttpResponse(f"New person with name: {name} added")
    except IntegrityError:
        return HttpResponse(f"Error: person with name: {name} already registered in DB")

这种方式依赖数据库层面的唯一约束,能避免并发场景下的竞态条件——比如两个请求同时提交同一名称时,数据库会直接拦截重复插入,不会出现数据不一致的问题。

2. 使用get_or_create简化逻辑(惯用写法)

Django 内置的get_or_create方法可以一键完成「查询-不存在则创建」的逻辑,返回包含对象和创建状态的元组,代码更简洁:

from django.http import HttpResponse
from .models import UniquePerson

def add_person(request, name):
    person, created = UniquePerson.objects.get_or_create(name=name)
    if created:
        return HttpResponse(f"New person with name: {name} added")
    else:
        return HttpResponse(f"Error: person with name: {name} already registered in DB")

这个方法内部同样通过捕获IntegrityError处理并发场景,和第一种方案本质一致,但可读性更强。

避坑提醒

不要用「先检查存在性再创建」的写法,比如:

# 不推荐,高并发下会有竞态风险
if not UniquePerson.objects.filter(name=name).exists():
    UniquePerson.objects.create(name=name)
else:
    # 返回错误提示

这种写法在多请求同时提交同一名称时,可能会同时通过exists()检查,最终插入重复数据,违反唯一约束。

内容的提问来源于stack exchange,提问作者user422005

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:03:19