字段'id'期望一个数字,但得到.list值



我正在尝试使用键值获取会话购物车,但得到这样的错误:类型错误:字段'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})

您在Cart.get()中的list()已经返回一个列表,因此您可以将其原样传递给过滤器。
我建议重命名它,所以在函数中你看到它是一个列表

def get_books_by_id(ids_list):
return int(Book.objects.filter(id__in = ids_list))

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

最新更新