Django出现‘... matching query does not exist.’错误,但对象确存在的问题
我来帮你梳理下这个常见的Django问题——明明数据库里有对应的对象,却一直抛出“matching query does not exist”异常,大概率是这几个细节没踩对:
主键类型不匹配或查询参数有偏差
你的Lesson和Sound都用了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值),后续查询TestPair的master_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




