Django拍卖系统报错‘List matching query does not exist’原因排查
Django拍卖程序:"List matching query does not exist" 错误排查
问题背景
开发Django拍卖程序后期,编写拍卖赢家选择逻辑并通过SQLite创建对应数据表后,出现List matching query does not exist错误。该错误导致主页无法展示商品,也无法查看商品信息;修改表列名无效,创建该表前其余代码运行正常。
报错栈
Traceback (most recent call last): File "C:\Users\N\AppData\Roaming\Python\Python311\site-packages\django\core\handlers\exception.py", line 55, in inner response = get_response(request) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\N\AppData\Roaming\Python\Python311\site-packages\django\core\handlers\base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\N\Desktop\New folder\commerce\auctions\views.py", line 72, in item_detail bid_desc = List.objects.get(pk = bidid, active_bool = True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\N\AppData\Roaming\Python\Python311\site-packages\django\db\models\manager.py", line 87, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\N\AppData\Roaming\Python\Python311\site-packages\django\db\models\query.py", line 637, in get raise self.model.DoesNotExist( ^ Exception Type: DoesNotExist at /auctions/1 Exception Value: List matching query does not exist.
相关功能代码
视图函数
# 商品详情页 def item_detail(request, bidid): bid_desc = List.objects.get(pk = bidid, active_bool = True) nowbids = Bidmodel.objects.filter(listb_id = bidid) return render(request, "auctions/item_detail.html",{ "list": bid_desc, "comments" : Comments.objects.filter(listc_id = bidid), "now_bid": minbid(bid_desc.first_bid, nowbids), }) # 确定赢家 def winner(request): bid_id = request.GET["listid"] nowbids = Bidmodel.objects.filter(listb_id = bid_id) biddesc = List.objects.get(pk = bid_id, active_bool = True) maxbid = minbid(biddesc.first_bid, nowbids) try: winner_who = Bidmodel.objects.get(bid = maxbid, listb_id = bid_id) winner_list = List.objects.get(id = bid_id) win = Winner(win_list = winner_list, user = winner_who.user) winners_name = winner_who.user except: winner_list = List.objects.get(first_bid = maxbid, id = bid_id) win = Winner(win_list = winner_list, user = winner_list.user) winners_name = winner_list.user biddesc.active_bool = False biddesc.save() win.save() messages.success(request, f"{winners_name} 赢得了 {win.win_list.title}。") return redirect("index") # 查看我的中标记录 def winner_check(request): try: yourwin = Winner.objects.filter(user = request.user.username) except: yourwin = None return render(request, "auctions/winner_check.html",{ "user_winlist" : yourwin, })
模板文件(winner_check.html)
{% extends "auctions/layout.html" %} {% block body %} <h2>我的中标记录</h2> <div> {% for list in user_winlist %} <div> <a>{{list.bid_win_list.title}}</a> <a>{{list.bid_win_list.category}}</a> <img src="{{ list.bid_win_list.image_url }}"> <p>{{ list.bid_win_list.descRIPTION }}</p> <div>该拍品由 <a>{{ list.bid_win_list.user }}</a> 发布。</div> </div> {% endfor %} </div>
SQLite数据表创建语句
CREATE TABLE auctions_winner( id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT, win_list_id INTEGER NOT NULL );
问题分析与解决思路
核心错误原因
报错指向item_detail视图中的List.objects.get(pk = bidid, active_bool = True),说明访问/auctions/1时,不存在pk=1且active_bool=True的List对象。结合winner函数逻辑可知:拍品确定赢家后,active_bool会被设为False并保存,此时再访问该商品详情页,get方法找不到符合条件的记录,直接抛出DoesNotExist异常。修复方案
- 调整商品详情页逻辑:允许展示已结束(
active_bool=False)的拍品,同时处理商品不存在的情况:def item_detail(request, bidid): try: bid_desc = List.objects.get(pk = bidid) except List.DoesNotExist: return HttpResponseNotFound("商品不存在") nowbids = Bidmodel.objects.filter(listb_id = bidid) return render(request, "auctions/item_detail.html",{ "list": bid_desc, "comments" : Comments.objects.filter(listc_id = bidid), "now_bid": minbid(bid_desc.first_bid, nowbids), "is_active": bid_desc.active_bool # 模板可通过该变量控制竞拍按钮显示 }) - 主页展示逻辑优化:主页仅展示
active_bool=True的商品,但详情页需支持查看所有商品(包括已结束的),避免用户访问已结束商品时出错。
- 调整商品详情页逻辑:允许展示已结束(
其他潜在问题修复
winner_check视图中,若Winner模型的user是关联User的外键,应使用user=request.user而非user=request.user.username;若为字符字段,需确保用户登录后request.user不为空。- 模板中
list.bid_win_list存在拼写错误,Winner模型的关联字段是win_list,应改为list.win_list.title。 - 避免手动创建SQLite表,改用Django的
makemigrations和migrate命令生成数据表,防止模型与表结构不一致。
内容的提问来源于stack exchange,提问作者zahra
相关产品推荐
相关产品推荐

