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

Django 1.11中get_or_create方法异常问题求助

解决Django 1.11 get_or_create 出现 'Key (slug)=() already exists.' 错误的问题

嘿,我来帮你排查这个有点矛盾的奇怪问题!明明要找的slug是ian-osborn,报错却提示空slug已经存在,这大概率是你的get_or_create调用或者模型/数据库配置里出了小纰漏,我整理了几个最可能的原因:

  • 参数传递出错:slug条件没生效
    你会不会在调用get_or_create时,把slug参数写错或者漏传了?比如不小心把slug放到了defaults里,或者直接没写查询条件?举个反例:

    # 错误写法:slug没作为查询条件,默认找空slug的记录
    DjProfile.objects.get_or_create(defaults={'slug': 'ian-osborn', 'name': 'Ian Osborn'})
    

    这种情况下Django会尝试匹配slug为空的记录,如果数据库里已经有一条空slug的DjProfile,就会触发冲突。正确的写法应该把slug放在查询条件里:

    # 正确写法:slug作为查询条件,找不到才创建对应记录
    DjProfile.objects.get_or_create(slug='ian-osborn', defaults={'name': 'Ian Osborn'})
    
  • 模型字段约束的坑:允许空但设置了唯一
    检查下你的DjProfile模型,slug字段是不是同时设置了unique=True和blank=True/null=True?如果是这样,数据库里只要有一条slug为空的记录,当你因为参数问题导致查询条件失效时,Django会尝试创建新的空slug记录,直接触发唯一约束冲突。
    你可以先在Django shell里排查已有数据:

    # 查有没有空slug的记录
    print(DjProfile.objects.filter(slug__isnull=True).exists())
    print(DjProfile.objects.filter(slug='').exists())
    

    如果有这类记录,要么修改它的slug值,要么调整模型字段(比如去掉blank=True,强制slug必须有值)。

  • QuerySet被意外过滤
    有没有可能你在调用get_or_create之前,对QuerySet做了额外过滤?比如:

    # 先过滤了空slug的子集,再调用get_or_create
    qs = DjProfile.objects.filter(slug='')
    obj, created = qs.get_or_create(slug='ian-osborn', defaults={'name': 'Ian Osborn'})
    

    这时候get_or_create会在“空slug”的子集里找slug='ian-osborn'的记录,肯定找不到,然后尝试在这个子集里创建新记录——也就是强制slug为空,自然就和已有数据冲突了。

  • 模型与数据库约束不一致
    如果你最近修改过slug字段的约束,但没有正确执行数据库迁移,可能导致模型定义和数据库实际约束不匹配。比如模型里修改了slug的规则,但数据库里的唯一约束还残留着旧的逻辑,也可能引发这种奇怪的报错。

你可以先在Django shell里做几步测试,快速定位问题:

# 1. 确认目标slug是否存在
print(DjProfile.objects.filter(slug='ian-osborn').exists())
# 2. 确认空slug记录情况
print(DjProfile.objects.filter(slug__in=['', None]).count())
# 3. 手动尝试创建,看具体报错
try:
    obj = DjProfile.objects.create(slug='ian-osborn', name='Ian Osborn')
except Exception as e:
    print(f"创建时的错误:{e}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:04:25