字段 'id' 需要一个数字,但得到了.list 值

时间:2021-03-04 17:25:34

标签: python django

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

2 个答案:

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