【问题标题】:DoesNotExist --Matching Query ErrorDoesNotExist -- 匹配查询错误
【发布时间】:2018-02-26 21:15:38
【问题描述】:

我正在尝试按类别列出一组交易

我有一个交易模型和一个类别模型,其中类别是交易的外键,如下所示:

class Deal(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=140, unique=True)
    description = models.TextField(default='')
    category = models.ForeignKey(Category)

类别页面的 urlpattern 如下所示:

url(r'^category/(?P<category>\w+)/$', deals_by_category, name='category')

其他网址如下所示:

    url(r'^all/$', DealListView.as_view(), name='deals'),
    url(r'^(?P<slug>.*)/$', deal_by_detail, name='deal_detail'),
    url(r'^category/(?P<category>\w+)/$', deals_by_category, name='category'),
    url(r'^home/$', DealHome.as_view(), name='deal_home'),
    url(r'^test/$', Home.as_view(), name='deal_test'),
    url(r'^(?P<pk>[0-9]+)/like', like, name='like'),

这个 urlpattern 的视图是这样的:

def deals_by_category(request,category):
    category_deals = Deal.objects.filter(category__name=category,
                                           )
    return render(request, 'deals/category.html', {'category_deals': category_deals})

我的其他视图如下所示:

class DealListView(generic.ListView):
    model = Deal
    context_object_name = 'deal_list'
    queryset = Deal.objects.all()
    template_name = 'deal_list.html'

 class DealHome(generic.TemplateView):
    model = Deal
    template_name = 'deals/test.html

def deal_by_detail(request, slug):
    deal_detail = Deal.objects.get(slug=slug)
    return render(request, 'deals/deal_detail.html', {'deal_detail': deal_detail})

def like(request, pk):
    if request.method == 'POST':
        deal = Deal.objects.get(pk=pk)
        deal.likes_total += 1
        deal.save()
        return redirect('home')

然后我的 category.html 模板会像这样循环遍历这些返回的交易:

{% for deal in category_deals %}
 <h5 class="card-retailer">{{ deal.retailer}}</h5>
                <p class="card-title">{{ deal.title }}</p>

现在如果我点击这样的预定类别链接就会出现问题:

http://localhost:8000/deals/category/Apparel/

但错误不是指向我的“deals_by_category”视图,而是指向每个交易的单个视图 --- 堆栈跟踪指向下面的第二行。我认为这一定很容易解决,但过去几个小时一直盯着这个问题,无法确定问题所在。

def deal_by_detail(request, slug):
    deal_detail = Deal.objects.get(slug=slug)
    return render(request, 'deals/deal_detail.html', {'deal_detail': deal_detail})

注意这里是完整的错误和回溯:

DoesNotExist at /deals/category/Apparel/
Deal matching query does not exist.
Request Method: GET
Request URL:    http://localhost:8000/deals/category/Apparel/

追溯:

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in get_response
  149.                     response = self.process_exception_by_middleware(e, request)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in get_response
  147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\crstu\Desktop\JSPROJ\dealmazing\deals\views.py" in deal_by_detail
  22.     deal_detail = Deal.objects.get(slug=slug)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\manager.py" in manager_method
  122.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "C:\Users\crstu\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\query.py" in get
  387.                 self.model._meta.object_name

Exception Type: DoesNotExist at /deals/category/Apparel/
Exception Value: Deal matching query does not exist.

【问题讨论】:

  • 如果您对错误有任何疑问,您需要发布该错误和完整的回溯。
  • 抱歉---刚刚发布了
  • 你的问题还不清楚。该 URL 由 deal_by_detail 视图提供,而不是 deals_by_category。如果这不是您所期望的,您需要发布整个 urls.py。
  • 不——我实际上希望在有人访问此链接时提供“deals_by_category”视图:“localhost:8000/deals/category/Apparel”我现在正在发布完整的网址和视图......一秒钟

标签: python django


【解决方案1】:

您的deal_by_detail URL 模式可以捕获任何字符序列。所以它将匹配任何 URL;它下面的任何其他模式都不会被调用。

您应该更具体,就像您对 category 模式所做的那样。

url(r'^(?P<slug>\w+)/$', deal_by_detail, name='deal_detail'),

【讨论】:

  • 是的,成功了——我怀疑——正则表达式基本上是我的氪石。感谢丹尼尔的帮助
  • 请注意,如果您使用的是 Django 2,则不再需要正则表达式,因为它正在转向更简单的“路径”语法 - 请参阅 the docs
  • 哦哇非常有趣!我休息了一段时间来学习 React,这对我来说就像一个全新的世界。不过我喜欢这种发展。
【解决方案2】:

正如堆栈跟踪所指出的,这就是问题所在。

deal_detail = Deal.objects.get(slug=slug)

当使用get且对象不存在时会出现异常DoesNotExist。这意味着您尝试使用的 slug 在数据库中不存在。

当您想要获取类别视图而不是详细视图时,错误实际上在于正则表达式(正如您正确怀疑的那样)。错误在于您使用了.*,这是贪婪的并且使用了所有剩余的字符。

如果您改为将正则表达式更改为以下内容。 r'^s/(?P&lt;slug&gt;\w+)/$',请注意开头的 s,这有助于保持 url 与其他 url 不同以及仅使用字母数字字符的 \w+

【讨论】:

  • 在你的视图函数中你可以使用快捷函数get_object_or_404在查询没有返回对象时返回404 http响应。
  • 谢谢——这可能是我的正则表达式的问题吗?——我实际上并不希望点击“deal_by_detail”视图——我需要“deals_by_category”视图
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2015-12-29
相关资源
最近更新 更多