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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 00:06:07