【问题标题】:ValueError at /checkout/ The QuerySet value for an exact lookup must be limited to one result using slicingValueError at /checkout/ 必须使用切片将精确查找的 QuerySet 值限制为一个结果
【发布时间】:2021-05-26 10:16:15
【问题描述】:

/checkout/ 处的 ValueError 精确查找的 QuerySet 值必须限制为使用切片的一个结果。 请求方法:GET 请求网址:http://127.0.0.1:8000/checkout/ Django 版本:3.2.3 异常类型:ValueError 异常值:
精确查找的 QuerySet 值必须使用切片限制为一个结果。

错误截图

APP views.py 结帐

@login_required
def checkout(request):
    if request.user.is_authenticated:
        name = request.user
        print(name)
        order=Orders(customerID=name)
        order.save()
        cart = Cart(request)
        for items in cart:
            print(items)
            OrderDetails(orderID=order,productID=items['product'],quantity=items['quantity'],price=items['total_price']).save()
        order = Orders.objects.filter(customerID=name)
        OrderDetail = OrderDetails.objects.filter(orderID=order)
        customerDetails = Customer.objects.filter(user=name).count()
        print(customerDetails)
        return render(request, 'app/checkout.html',{'orders':OrderDetail,'address':customerDetails})

结帐模板

{% extends 'app/base.html' %}
{% load static %}
{% block title %}Buy Now{% endblock title %}
{% block main-content %}
<div class="container">
 <div class="row mt-5">
  <div class="col-sm-6">
    <h4>Order Summary</h4>
    <hr>
    {% for order in orders %}
      <div class="card mb-2">
        <div class="card-body">
          <h5>{{order.name}}</h5>
          <p>Quantity: {{order.quantity}}</p>
          <p class="fw-bold">Price: {{order.price}}</p>
        </div>
      </div>
      {% endfor %} 
    <small>Term and Condition: Lorem ipsum dolor sit amet consectetur adipisicing elit. Mollitia, ullam saepe! Iure optio repellat dolor velit, minus rem. Facilis cumque neque numquam laboriosam, accusantium adipisci nisi nihil in et quis?</small>
  </div>
  <div class="col-sm-4 offset-sm-1">
    <h4>Shipping Address</h4>
    <hr>
    {% for ad in address %}
      <div class="card">
        <div class="card-body">
        <h5>{{ad.name}}</h5>
        <p>{{ad.address}}</p>
        <p>{{ad.phone}}</p>
        </div>
        {% endfor %}
      </div>
        <div class="form-check mt-2 mb-5">
          <input class="form-check-input" type="radio" value="">
          <label class="form-check-label fw-bold" for="">
           </label>
        </div>
        <form action="{% url 'app:buy-now' %}">
        <div class="text-end">
          <button type="submit" class="btn btn-warning mt-3 px-5 fw-bold">Continue</button>
        </div>
      </form>
    </div>
  </div>
</div>
{% endblock main-content %)

APP Urls.py

from re import template
from django.urls import path
from app import views

from django.conf import settings
from django.conf.urls.static import static
from django.contrib.auth import views as auth_views
from.forms import LoginForm, MyPasswordChangeForm

app_name='app'

urlpatterns = [
    # path('', views.home),
    path('',views.ProductView,name='home'),
    path('product-detail/<int:pk>', views.ProductDetailView.as_view(), name='product-detail'),
    path('showcart/',views.show_cart,name='showcart'),
    path('Fruits/', views.Fruits, name='Fruits'),
    path('Fruits/<slug:data>', views.Fruits, name='FruitsData'),
    path('Dried/', views.Dried, name='Dried'),
    path('Dried/<slug:data>', views.Dried, name='DriedData'),
    path('Vegetables/', views.Vegetables, name='Vegetables'),
    path('Vegetables/<slug:data>', views.Vegetables, name='VegetablesData'),
    path('profile/', views.ProfileView.as_view(), name='profile'),
    path('address/', views.address, name='address'),
    path('accounts/login/',auth_views.LoginView.as_view(template_name='app/login.html',authentication_form=LoginForm),name='login'),
    path('passwordchange/',auth_views.PasswordChangeView.as_view(template_name='app/passwordchange.html',form_class=MyPasswordChangeForm, success_url='/passwordchangedone/'),name='passwordchange'),
    path('passwordchangedone/',auth_views.PasswordChangeDoneView.as_view(template_name='app/passwordchangedone.html'),name='passwordchangedone'),
    path('logout/',auth_views.LogoutView.as_view(next_page='app:login'),name='logout'),
    path('registration/', views.CustomerRegistrationView.as_view(), name='customerregistration'),
   
    path('buy/', views.buy_now, name='buy-now'),

    path('orders/', views.orders, name='orders'),
    # path('changepassword/', views.change_password, name='changepassword'),
    
    path('checkout/', views.checkout, name='checkout'),
     # path('add-to-cart/', views.add_to_cart, name='add-to-cart'),

    # path('pluscart/',views.plus_cart),
    # path('minuscart/',views.minus_cart),
    # path('removecart/',views.remove_cart),


    # path('add-to-cart/<slug:data>', views.add_to_cart, name='add-to-cart_DATA'),



] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

【问题讨论】:

    标签: python django


    【解决方案1】:

    order = Orders.objects.filter(customerID=name)

    必须改成:

    order = Orders.objects.latest('id')

    出现此错误是因为模型具有一对多关系,但过滤器所做的是获取客户订单的多个值。 如果一位客户下订单,他将有一个 orderID,但订单中有多个产品。因此,由于 order 在此处返回多个值,因此为了按顺序获取产品,我们会遇到切片错误。 所以,为了解决这个问题,我使用了 'latest()' 一个内置的 django 模型函数,它从表中检索最新添加的 id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2019-05-26
      • 2019-10-02
      • 1970-01-01
      • 2019-11-10
      • 2021-07-20
      • 2021-04-23
      相关资源
      最近更新 更多