Python Django error:ValueError位于/cart/->;精确查找的QuerySet值必须限制为使用切片的一个结果
将书籍添加到购物车时,我遇到一个值错误。它指向订单的views.py中的for循环。我想不出解决的办法。感谢您的帮助 书店django/store/views.py”,第68行,在购物车中 对于订单中的订单: 异常类型:ValueError位于/cart/ 异常值:精确查找的QuerySet值必须限制为使用切片的一个结果 型号.pyPython Django error:ValueError位于/cart/->;精确查找的QuerySet值必须限制为使用切片的一个结果,python,django,Python,Django,将书籍添加到购物车时,我遇到一个值错误。它指向订单的views.py中的for循环。我想不出解决的办法。感谢您的帮助 书店django/store/views.py”,第68行,在购物车中 对于订单中的订单: 异常类型:ValueError位于/cart/ 异常值:精确查找的QuerySet值必须限制为使用切片的一个结果 型号.py from django.db import models from django.db.models.query import prefetch_related_o
from django.db import models
from django.db.models.query import prefetch_related_objects
from django.utils import timezone
from django.contrib.auth.models import User
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
def __str__(self):
return "%s, %s" % (self.last_name, self.first_name)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE, null=True, blank=True)
description = models.TextField()
publish_date = models.DateField(default=timezone.now)
price = models.DecimalField(decimal_places=2, max_digits=8)
stock = models.IntegerField(default=2)
class Meta:
verbose_name ='Book'
verbose_name_plural = 'Books'
db_table = 'book' #default is store_book
class Review(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
publish_date = models.DateField(default=timezone.now)
text = models.TextField()
class Cart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
active = models.BooleanField(default=True)
order_date = models.DateField(null=True)
payment_type = models.CharField(max_length=100, null=True)
payment_id = models.CharField(max_length=100, null=True)
def add_to_cart(self, book_id):
book = Book.objects.get(pk=book_id)
try:
preexisting_order = BookOrder.objects.get(book=book, cart=self)
preexisting_order.quantity += 1
preexisting_order.save()
except BookOrder.DoesNotExist:
new_order = BookOrder.objects.create(
book=book,
cart=self,
quantity = 1
)
new_order.save
def remove_from_cart(self, book_id):
book = Book.objects.get(pk=book_id)
try:
preexisting_order = BookOrder.objects.get(book=book, cart=self)
if preexisting_order.quantity > 1:
preexisting_order.quantity -= 1
preexisting_order.save()
else:
preexisting_order.delete()
except BookOrder.DoesNotExist:
pass
class BookOrder(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
quantity = models.IntegerField()
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import redirect, render
from .models import Book, BookOrder, Cart
def index(request):
context = {
}
return render(request, 'template.html', context)
def store(request):
books = Book.objects.all()
context = {
'books': books,
}
return render(request, 'base.html', context)
def book_details(request, book_id):
context = {
'book': Book.objects.get(pk=book_id),
}
return render(request, 'store/detail.html', context)
def add_to_cart(request, book_id):
if request.user.is_authenticated:
try:
book = Book.objects.get(pk=book_id)
except ObjectDoesNotExist:
pass
else:
try:
cart = Cart.objects.get(user=request.user, active=True)
except ObjectDoesNotExist:
cart = Cart.objects.create(
user=request.user
)
cart.save()
cart.add_to_cart(book_id)
return redirect('store:cart')
else:
return redirect('index')
def remove_from_cart(request, book_id):
if request.user.is_authenticated:
try:
book = Book.objects.get(pk=book_id)
except ObjectDoesNotExist:
pass
else:
cart = Cart.objects.get(user=request.user, active=True)
cart.remove_from_cart(book_id)
return redirect('cart')
else:
return redirect('index')
def cart(request):
if request.user.is_authenticated:
cart = Cart.objects.filter(user=request.user.id, active=True)
orders = BookOrder.objects.filter(cart=cart)
total = 0
count = 0
for order in orders:
total += (order.book.price * order.quantity)
count += order.quantity
context = {
'cart': orders,
'total': total,
'count': count,
}
return render(request, 'store/cart.html', context)
else:
return redirect('index')
from django.urls import path
from . import views
app_name = 'store'
urlpatterns = [
path('', views.index, name='index' ),
path('store/', views.store, name='store' ),
path('store/<int:book_id>', views.book_details, name='book_details'),
path('add/<int:book_id>', views.add_to_cart, name='add_to_cart'),
path('remove/<int:book_id>', views.remove_from_cart, name='remove_from_cart'),
path('cart/', views.cart, name='cart'),
]
视图.py
from django.db import models
from django.db.models.query import prefetch_related_objects
from django.utils import timezone
from django.contrib.auth.models import User
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
def __str__(self):
return "%s, %s" % (self.last_name, self.first_name)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE, null=True, blank=True)
description = models.TextField()
publish_date = models.DateField(default=timezone.now)
price = models.DecimalField(decimal_places=2, max_digits=8)
stock = models.IntegerField(default=2)
class Meta:
verbose_name ='Book'
verbose_name_plural = 'Books'
db_table = 'book' #default is store_book
class Review(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
publish_date = models.DateField(default=timezone.now)
text = models.TextField()
class Cart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
active = models.BooleanField(default=True)
order_date = models.DateField(null=True)
payment_type = models.CharField(max_length=100, null=True)
payment_id = models.CharField(max_length=100, null=True)
def add_to_cart(self, book_id):
book = Book.objects.get(pk=book_id)
try:
preexisting_order = BookOrder.objects.get(book=book, cart=self)
preexisting_order.quantity += 1
preexisting_order.save()
except BookOrder.DoesNotExist:
new_order = BookOrder.objects.create(
book=book,
cart=self,
quantity = 1
)
new_order.save
def remove_from_cart(self, book_id):
book = Book.objects.get(pk=book_id)
try:
preexisting_order = BookOrder.objects.get(book=book, cart=self)
if preexisting_order.quantity > 1:
preexisting_order.quantity -= 1
preexisting_order.save()
else:
preexisting_order.delete()
except BookOrder.DoesNotExist:
pass
class BookOrder(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
quantity = models.IntegerField()
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import redirect, render
from .models import Book, BookOrder, Cart
def index(request):
context = {
}
return render(request, 'template.html', context)
def store(request):
books = Book.objects.all()
context = {
'books': books,
}
return render(request, 'base.html', context)
def book_details(request, book_id):
context = {
'book': Book.objects.get(pk=book_id),
}
return render(request, 'store/detail.html', context)
def add_to_cart(request, book_id):
if request.user.is_authenticated:
try:
book = Book.objects.get(pk=book_id)
except ObjectDoesNotExist:
pass
else:
try:
cart = Cart.objects.get(user=request.user, active=True)
except ObjectDoesNotExist:
cart = Cart.objects.create(
user=request.user
)
cart.save()
cart.add_to_cart(book_id)
return redirect('store:cart')
else:
return redirect('index')
def remove_from_cart(request, book_id):
if request.user.is_authenticated:
try:
book = Book.objects.get(pk=book_id)
except ObjectDoesNotExist:
pass
else:
cart = Cart.objects.get(user=request.user, active=True)
cart.remove_from_cart(book_id)
return redirect('cart')
else:
return redirect('index')
def cart(request):
if request.user.is_authenticated:
cart = Cart.objects.filter(user=request.user.id, active=True)
orders = BookOrder.objects.filter(cart=cart)
total = 0
count = 0
for order in orders:
total += (order.book.price * order.quantity)
count += order.quantity
context = {
'cart': orders,
'total': total,
'count': count,
}
return render(request, 'store/cart.html', context)
else:
return redirect('index')
from django.urls import path
from . import views
app_name = 'store'
urlpatterns = [
path('', views.index, name='index' ),
path('store/', views.store, name='store' ),
path('store/<int:book_id>', views.book_details, name='book_details'),
path('add/<int:book_id>', views.add_to_cart, name='add_to_cart'),
path('remove/<int:book_id>', views.remove_from_cart, name='remove_from_cart'),
path('cart/', views.cart, name='cart'),
]
url.py
from django.db import models
from django.db.models.query import prefetch_related_objects
from django.utils import timezone
from django.contrib.auth.models import User
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
def __str__(self):
return "%s, %s" % (self.last_name, self.first_name)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE, null=True, blank=True)
description = models.TextField()
publish_date = models.DateField(default=timezone.now)
price = models.DecimalField(decimal_places=2, max_digits=8)
stock = models.IntegerField(default=2)
class Meta:
verbose_name ='Book'
verbose_name_plural = 'Books'
db_table = 'book' #default is store_book
class Review(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
publish_date = models.DateField(default=timezone.now)
text = models.TextField()
class Cart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
active = models.BooleanField(default=True)
order_date = models.DateField(null=True)
payment_type = models.CharField(max_length=100, null=True)
payment_id = models.CharField(max_length=100, null=True)
def add_to_cart(self, book_id):
book = Book.objects.get(pk=book_id)
try:
preexisting_order = BookOrder.objects.get(book=book, cart=self)
preexisting_order.quantity += 1
preexisting_order.save()
except BookOrder.DoesNotExist:
new_order = BookOrder.objects.create(
book=book,
cart=self,
quantity = 1
)
new_order.save
def remove_from_cart(self, book_id):
book = Book.objects.get(pk=book_id)
try:
preexisting_order = BookOrder.objects.get(book=book, cart=self)
if preexisting_order.quantity > 1:
preexisting_order.quantity -= 1
preexisting_order.save()
else:
preexisting_order.delete()
except BookOrder.DoesNotExist:
pass
class BookOrder(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
quantity = models.IntegerField()
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import redirect, render
from .models import Book, BookOrder, Cart
def index(request):
context = {
}
return render(request, 'template.html', context)
def store(request):
books = Book.objects.all()
context = {
'books': books,
}
return render(request, 'base.html', context)
def book_details(request, book_id):
context = {
'book': Book.objects.get(pk=book_id),
}
return render(request, 'store/detail.html', context)
def add_to_cart(request, book_id):
if request.user.is_authenticated:
try:
book = Book.objects.get(pk=book_id)
except ObjectDoesNotExist:
pass
else:
try:
cart = Cart.objects.get(user=request.user, active=True)
except ObjectDoesNotExist:
cart = Cart.objects.create(
user=request.user
)
cart.save()
cart.add_to_cart(book_id)
return redirect('store:cart')
else:
return redirect('index')
def remove_from_cart(request, book_id):
if request.user.is_authenticated:
try:
book = Book.objects.get(pk=book_id)
except ObjectDoesNotExist:
pass
else:
cart = Cart.objects.get(user=request.user, active=True)
cart.remove_from_cart(book_id)
return redirect('cart')
else:
return redirect('index')
def cart(request):
if request.user.is_authenticated:
cart = Cart.objects.filter(user=request.user.id, active=True)
orders = BookOrder.objects.filter(cart=cart)
total = 0
count = 0
for order in orders:
total += (order.book.price * order.quantity)
count += order.quantity
context = {
'cart': orders,
'total': total,
'count': count,
}
return render(request, 'store/cart.html', context)
else:
return redirect('index')
from django.urls import path
from . import views
app_name = 'store'
urlpatterns = [
path('', views.index, name='index' ),
path('store/', views.store, name='store' ),
path('store/<int:book_id>', views.book_details, name='book_details'),
path('add/<int:book_id>', views.add_to_cart, name='add_to_cart'),
path('remove/<int:book_id>', views.remove_from_cart, name='remove_from_cart'),
path('cart/', views.cart, name='cart'),
]
从django.url导入路径
从。导入视图
应用程序名称='商店'
URL模式=[
路径(“”,views.index,name='index'),
路径('store/',views.store,name='store'),
路径('store/',views.book\u details,name='book\u details'),
路径('add/',views.add_to_cart,name='add_to_cart'),
路径('remove/',views.remove_from_cart,name='remove_from_cart'),
路径('cart/',views.cart,name='cart'),
]
cart.html
{% block body %}
<div class="col-md-8 col-md-offset-2 col-sm-12 maincontent col-center">
<div style="text-align:center;text-decoration:underline"><h3>Your Cart</h3></div>
<div class="cart_container">
{% for item in cart %}
<div class="cart_item">
<div class="cart_listing">
<span class="title">{{ item.book.title }}</span> by {{ item.book.author.first_name }} {{ item.book.author.last_name }}
</div>
<div class="cart_price">
<span class="cart_quantity">{{ item.quantity }} x $ <span class="cart_value">{{ item.book.price }}</span></span>
Quantity: <a href="{% url 'store:add_to_cart' book.id %}">[+]</a> /
<a href="{ url 'store:remove_from_cart' item.book.id %}">[-]</a>
</div>
</div>
{% empty %}
<div>
There are no items in your cart.
</div>
{% endfor %}
<div class="cart_total">
<h4> Total: $<span class="cart_value">{{ total }}</span></h4>
</div>
</div>
</div>
</div>
{% endblock %}
{% block body %}
<div class="col-md-8 col-md-offset-2 col-sm-12 maincontent col-center" >
<div style="text-align:center"><h3>Welcome to our store!</h3></div>
{% for book in books%}
<div class="storefront_book_display">
<a href="{% url 'store:book_details' book.id %}">
<img src="{% static 'base/img/empty_cover.jpg' %}">
<span class="storefront_book_title">{{ book.title }}</span>
<span class="storefront_book_author">{{ book.author }}</span>
</a>
<span class="storefront_add_to_cart">
<a href="{% url 'store:add_to_cart' book.id %}">Add to cart</a>
</span>
</div>
{% endfor %}
</div>
{% endblock %}
{%block body%}
你的车
{购物车%中的商品为%1}
{{item.book.title}}{{item.book.author.first_name}{{item.book.author.last_name}}
{{item.quantity}}x${{{item.book.price}
数量:/
{%empty%}
您的购物车中没有商品。
{%endfor%}
总计:${{Total}
{%endblock%}
base.html
{% block body %}
<div class="col-md-8 col-md-offset-2 col-sm-12 maincontent col-center">
<div style="text-align:center;text-decoration:underline"><h3>Your Cart</h3></div>
<div class="cart_container">
{% for item in cart %}
<div class="cart_item">
<div class="cart_listing">
<span class="title">{{ item.book.title }}</span> by {{ item.book.author.first_name }} {{ item.book.author.last_name }}
</div>
<div class="cart_price">
<span class="cart_quantity">{{ item.quantity }} x $ <span class="cart_value">{{ item.book.price }}</span></span>
Quantity: <a href="{% url 'store:add_to_cart' book.id %}">[+]</a> /
<a href="{ url 'store:remove_from_cart' item.book.id %}">[-]</a>
</div>
</div>
{% empty %}
<div>
There are no items in your cart.
</div>
{% endfor %}
<div class="cart_total">
<h4> Total: $<span class="cart_value">{{ total }}</span></h4>
</div>
</div>
</div>
</div>
{% endblock %}
{% block body %}
<div class="col-md-8 col-md-offset-2 col-sm-12 maincontent col-center" >
<div style="text-align:center"><h3>Welcome to our store!</h3></div>
{% for book in books%}
<div class="storefront_book_display">
<a href="{% url 'store:book_details' book.id %}">
<img src="{% static 'base/img/empty_cover.jpg' %}">
<span class="storefront_book_title">{{ book.title }}</span>
<span class="storefront_book_author">{{ book.author }}</span>
</a>
<span class="storefront_add_to_cart">
<a href="{% url 'store:add_to_cart' book.id %}">Add to cart</a>
</span>
</div>
{% endfor %}
</div>
{% endblock %}
{%block body%}
欢迎光临本店!
{书籍中书籍的百分比%}
{%endfor%}
{%endblock%}
您的问题在于:
cart = Cart.objects.filter(user=request.user.id, active=True) # this is a queryset
orders = BookOrder.objects.filter(cart=cart) # this is the exact lookup mentioned
cart
在这里是一个查询集,而不是一个实例。如果您只希望使用一个可能的cart,请使用。获取
。如果可能有多个结果,请像现在一样使用筛选器,但在订单查询中使用\u in
将其更改为:
cart = Cart.objects.get(user=request.user.id, active=True)
orders = BookOrder.objects.filter(cart=cart)
或