You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Django出现‘... matching query does not exist.’错误,但对象确存在的问题

排查Django中“... matching query does not exist.”错误(对象实际存在的情况)

我来帮你梳理下这个常见的Django问题——明明数据库里有对应的对象,却一直抛出“matching query does not exist”异常,大概率是这几个细节没踩对:

  • 主键类型不匹配或查询参数有偏差
    你的LessonSound都用了CharField作为主键,而非默认的自增整数。如果查询时传入的参数类型不对(比如把整数1当成字符串"1"传),或者参数有大小写、空格这类隐形差异(比如数据库里是"abc123",你查询时传的是"Abc123""abc123 "),都会导致找不到对象。
    解决办法:先打印出你要查询的参数,再直接去数据库里核对对应字段的内容,确保参数和数据库里的完全一致。比如用print(your_query_param)输出,再对比数据库表中的值。

  • 事务未提交导致的查询隔离
    如果你是在一个未提交的事务里创建了对象,然后在另一个上下文(比如另一个视图、新的shell会话)里查询,就会看不到这个对象。比如在Django shell里手动开启事务但没提交:

    from django.db import transaction
    from myapp.models import Sound
    
    with transaction.atomic():
        s = Sound.objects.create(sound_hash="test_hash")
        # 这里事务还没提交
    Sound.objects.get(pk="test_hash")  # 此时会报错,因为事务外看不到未提交的对象
    

    解决办法:确保创建对象后事务已提交,Django默认是自动提交模式,但如果手动用了事务,记得调用transaction.commit(),或者在atomic()块外执行查询。

  • 多对多/外键关联的操作误区
    你的TestPair模型里master_sound是外键关联到Sound,如果创建TestPair时传入的是未保存的Sound对象,或者传入的master_sound_id对应的Sound并不存在(比如手动填了错误的hash值),后续查询TestPairmaster_sound时就会抛出异常。另外,通过多对多的related_name查询时(比如lesson.words.get(...)),也要确保查询条件匹配关联集合里的对象。
    解决办法:创建TestPair时,要么传入已经保存到数据库的Sound对象,要么传入正确的sound_hash值(比如用master_sound_id="existing_hash"的方式)。

  • 数据库一致性或缓存问题
    极少数情况是数据库本身的问题,比如外键约束被手动破坏(比如直接在数据库里删了Sound记录,但TestPair里还保留着对应的master_sound_id),或者Django缓存导致查询结果过时。
    解决办法:直接用SQL语句查询数据库确认对象存在(比如SELECT * FROM your_app_sound WHERE sound_hash='your_target_hash';),如果确实存在,就清除Django缓存(比如调用python manage.py clearcache),或者重启服务器试试。

  • 查询方法的使用错误
    get()方法本身就会在找不到对象或找到多个对象时抛出异常,有时候你以为对象存在,但实际查询条件可能匹配到0个或多个结果。比如你用Lesson.objects.get(list_name="xxx"),但数据库里可能没有这个值(不过你的Lesson主键是list_name,所以不会有多个,但其他查询场景可能)。
    解决办法:先换成filter()方法测试,比如Sound.objects.filter(pk="your_hash"),如果返回空QuerySet,说明查询条件确实有问题;如果返回结果,再调整成get()或者用first()获取单个对象。

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

火山引擎 最新活动