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

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
);

问题分析与解决思路

  1. 核心错误原因
    报错指向item_detail视图中的List.objects.get(pk = bidid, active_bool = True),说明访问/auctions/1时,不存在pk=1且active_bool=True的List对象。结合winner函数逻辑可知:拍品确定赢家后,active_bool会被设为False并保存,此时再访问该商品详情页,get方法找不到符合条件的记录,直接抛出DoesNotExist异常。

  2. 修复方案

    • 调整商品详情页逻辑:允许展示已结束(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的商品,但详情页需支持查看所有商品(包括已结束的),避免用户访问已结束商品时出错。
  3. 其他潜在问题修复

    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:15:56