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

Django使用update_or_create后页面刷新出现数据重复问题

问题分析与解决方案

核心问题原因

  1. update_or_create用法错误:你当前把code、age、service全部作为记录匹配条件,这意味着只有当三条字段完全与数据库现有记录一致时才会更新,只要其中任意字段(比如age或service)出现细微差异(如空格、格式变化),就会创建新记录。但code作为员工唯一标识,才应该是唯一的匹配依据。
  2. 数据库无唯一约束:你的Empl模型中code字段未设置唯一约束,即使代码逻辑出错,数据库也不会阻止重复code的记录创建。
  3. 搜索逻辑可能存在冗余:你提到MySQL按code过滤仅返回一条,但搜索栏显示重复,大概率是搜索功能未基于唯一字段做精准查询,或未对结果去重。

分步解决方案

1. 修正数据同步逻辑

修改views.py中的update_or_create调用,仅用code作为匹配条件,将age和service作为待更新字段:

url='http://myAPI/Empl/GetEmpl'
x=requests.get(url)
content=x.json()
for data in content:
    # 仅用code匹配记录,其他字段放入defaults更新
    emp, _ = Empl.objects.update_or_create(
        code=data['code'],
        defaults={
            'age': data['age'],
            'service': data['service']
        }
    )
# 无需额外调用emp.save(),update_or_create已自动处理保存

2. 清理现有重复数据

如果数据库中已存在重复code的记录,可通过Django Shell清理:

from your_app.models import Empl
from django.db.models import Count

# 找出所有重复的code
duplicate_codes = Empl.objects.values('code').annotate(record_count=Count('id')).filter(record_count__gt=1)

# 保留每个code的第一条记录,删除其余重复项
for item in duplicate_codes:
    target_code = item['code']
    Empl.objects.filter(code=target_code)[1:].delete()

3. 添加数据库层面的唯一约束

修改models.py,给code字段添加唯一约束,从根源阻止重复:

class Empl(models.Model):
    code=models.CharField(max_length=10,blank=True,null=True, unique=True)
    age=models.CharField(max_length=255,blank=True,null=True)
    service=models.CharField(max_length=255,blank=True,null=True)

执行迁移使约束生效:

python manage.py makemigrations
python manage.py migrate

4. 检查搜索栏逻辑

确认搜索功能的查询语句是否基于code做精准匹配,例如:

# 正确的精准查询示例
results = Empl.objects.filter(code__exact=search_keyword).distinct()

避免模糊查询时返回多条重复显示的记录,或确保查询结果做了去重处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:35:35