我正在尝试使用键值获取会话购物车,但出现如下错误: 类型错误:字段 'id' 需要一个数字,但得到 ['3', '2', '4', '6', '8']。 "GET /book/cart/ HTTP/1.1" 500 134321
我需要改变的地方:
models.py
class Book(models.Model):
Books_cond_choice = (
('Old Book', 'Old'),
('New Book', 'New'),
)
book_id = models.AutoField
book_condition = models.CharField(max_length=10, choices=Books_cond_choice)
book_name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
book_auther = models.CharField(max_length=200)
pub_date = models.DateField()
category = models.CharField(max_length=50, default="")
subcategory = models.CharField(max_length=50, default="")
pagecount = models.IntegerField(default=0)
desc = models.CharField(max_length=300)
image = models.ImageField(upload_to='book/images', default="")
def __str__(self):
return self.book_name
@staticmethod
def get_books_by_id(id):
return int(Book.objects.filter(id__in = [id]))
views.py
class Cart(View):
def get(self, request):
ids = list(request.session.get('cart').keys())
books = Book.get_books_by_id(ids)
print(books)
return render(request, 'book/cart.html', {'books' : books})
答案 0 :(得分:0)
您在 list()
中的 Cart.get()
已经返回一个列表,因此您可以将其按原样传递给过滤器。
我建议重命名它,所以在函数中你会看到它是一个列表
def get_books_by_id(ids_list):
return int(Book.objects.filter(id__in = ids_list))
答案 1 :(得分:0)
在 ids = list(request.session.get('cart').keys())
行中,我假设您获得了 Book
实例的 id 列表。稍后您使用 Book.get_books_by_id(ids)
,其中您的实现如下:
@staticmethod
def get_books_by_id(id):
return int(Book.objects.filter(id__in = [id]))
问题是 ids
已经是一个列表。此外,这应该是 classmethod
而不是 staticmethod
。此外,我相信您想要书籍的实例而不是整数(无论如何,类型转换为 int
没有多大意义)。
class Book(models.Model):
Books_cond_choice = (
('Old Book', 'Old'),
('New Book', 'New'),
)
book_id = models.AutoField # Also this is not even used?? Why have it here?
book_condition = models.CharField(max_length=10, choices=Books_cond_choice)
book_name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
book_auther = models.CharField(max_length=200)
pub_date = models.DateField()
category = models.CharField(max_length=50, default="")
subcategory = models.CharField(max_length=50, default="")
pagecount = models.IntegerField(default=0)
desc = models.CharField(max_length=300)
image = models.ImageField(upload_to='book/images', default="")
def __str__(self):
return self.book_name
@classmethod
def get_book_by_id(cls, id):
try:
return cls.objects.get(id=id)
except cls.DoesNotExist:
return None
@classmethod
def get_books_by_ids(cls, ids): # renamed function as it expected multiple ids
return cls.objects.filter(id__in=ids)
现在你的观点:
class Cart(View):
def get(self, request):
ids = list(request.session.get('cart').keys())
books = Book.get_books_by_ids(ids)
print(books)
return render(request, 'book/cart.html', {'books' : books})