Django项目刷新浏览器导致SQLite重复存储数据该如何解决?
解决Django重复插入第三方API数据的方案
1. 快速修复(仅修改视图代码)
你可以直接使用Django ORM内置的get_or_create()方法替代直接save,该方法会先按指定条件查询数据库,匹配到记录则不执行插入,未匹配到才创建新记录,刚好符合你的需求。
修改后的views.py代码如下:
import requests from django.shortcuts import redirect from .models import DogFacts def api(request): url = 'https://dog-facts-api.herokuapp.com/api/v1/resources/dogs/all' response = requests.get(url) json_response = response.json() # 去重插入逻辑 for i in json_response: fact_content = i.get("fact") # 按fact字段查询,存在则返回,不存在则创建 DogFacts.objects.get_or_create(fact=fact_content) return redirect('api')
2. 数据库层面加约束(更稳妥的优化方案)
仅靠代码逻辑校验仍存在小概率写入重复数据的风险,建议给模型的fact字段加唯一约束,从数据库底层避免重复数据写入:
修改后的models.py代码如下:
from django.db import models class DogFacts(models.Model): # 加unique=True,确保该字段值全表唯一 fact = models.CharField(max_length=100, unique=True) def __str__(self): return self.fact
修改模型后需要执行迁移命令生效:
python manage.py makemigrations python manage.py migrate
注意:如果你的表里已经存在重复数据,执行迁移前需要先清理重复的fact记录,否则迁移会失败。
3. 大数据量场景的优化方案
如果拉取的API数据量很大,循环调用get_or_create()性能偏低,可以使用bulk_create()的ignore_conflicts参数批量插入,自动跳过重复的唯一约束记录,性能提升明显:
修改后的视图代码示例:
def api(request): url = 'https://dog-facts-api.herokuapp.com/api/v1/resources/dogs/all' response = requests.get(url) json_response = response.json() # 批量构造DogFacts对象 fact_list = [DogFacts(fact=i.get("fact")) for i in json_response] # ignore_conflicts=True会自动跳过触发唯一约束冲突的记录 DogFacts.objects.bulk_create(fact_list, ignore_conflicts=True) return redirect('api')
内容的提问来源于stack exchange,提问作者Iftekhar Chowdhury
相关产品推荐
相关产品推荐

