在 Django 中实现幂等删除
发布: (2026年2月9日 GMT+8 06:19)
2 分钟阅读
原文: Dev.to
Source: Dev.to

今天我在为我的 Django 库存系统实现删除 mutation。目标是让该端点具备幂等性:
DELETE /items/<item_id>/
- 如果对象存在 → 删除它
- 如果对象不存在 → 不做任何改变
- 始终可以安全重试
问题
删除实际上并没有改变状态。
我写的是:
Item.objects.filter(item_id).delete()
而不是:
Item.objects.filter(id=item_id).delete()
由于查询没有在正确的字段上过滤,状态转变没有发生。端点看起来好像工作了,但底层状态并未被正确修改。
解决方案
使用:
Item.objects.filter(id=item_id).delete()
并放在事务中,使删除天然具备幂等性:
- 已存在的对象 → 被删除
- 不存在的对象 → 什么也不做
- 在重试时安全
不需要额外的条件逻辑。
系统收获
幂等性往往来源于你如何构造查询和状态转变,而不是通过添加更多的控制流。
以这种方式设计删除可以让服务:
- 无状态
- 重试安全
- 可预测
下一步
下一个特性是原子化的数量更新:
- 强制不变量
- 事务边界
- 防止更新丢失
每天实现一个特性,首先关注正确性。