首页 > 解决方案 > Django int() 参数必须是字符串、类似字节的对象或数字,而不是“OrderItem”

问题描述

我正在为在线商店编码,视图无法获取参数。我哪里做错了?

Models.py 有 3 个模型,产品模型、订单模型和 order_item 模型,用于创建订单并保存到购物车:

class Product(models.Model):
    product_name = models.CharField(max_length=200)
    price = models.DecimalField(decimal_places=2, max_digits=10, blank=True)
    created = models.DateTimeField(auto_now=True)
    img = models.ImageField(upload_to='product', height_field=None, width_field=None, max_length=100, default='https://res.cloudinary.com/hsvaxmvxo/image/upload/v1594136644/product/coming_soon_uqxysa.jpg')
    
    description = models.TextField(blank=True, null=True)
    Hot = models.BooleanField(default=False)
    type = models.CharField(
        max_length=2,
        choices=PRODUCT_CHOICES,
        default=DECORATION,
    )
    status = models.IntegerField(choices=STATUS, default=0)
    slug = models.SlugField(max_length=200, unique=True)

    def __str__(self):
        return self.product_name

    def get_absolute_url(self):
        return f"{self.slug}"

    def get_add_to_cart_url(self):
        return reverse("add_to_cart", kwargs={'slug':self.slug})

    def remove_from_cart_url(self):
        return reverse("remove_from_cart", kwargs={'slug':self.slug})

    
class OrderItem(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
    item = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    ordered = models.BooleanField(default=False)

    def __str__(self):
        return f"{self.quantity} of {self.item.product_name}"

    def get_total_price(self):
        return self.quantity * self.item.price

class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
    items = models.ManyToManyField(OrderItem)
    start_date = models.DateTimeField(auto_now_add=True)
    ordered_date = models.DateTimeField()
    ordered = models.BooleanField(default=False)

    def __str__(self):
        return self.user.username

views.py 中的添加到购物车功能:

def add_to_cart(request, slug):
 item = get_object_or_404(Product, slug=slug)
 order_items = OrderItem.objects.get_or_create(
    item=item,
    user=request.user,
    ordered=False
 )
 order_qs = Order.objects.filter(user=request.user, ordered=False)
 if order_qs.exists():
    order = order_qs[0]
    if order.items.filter(item__slug=item.slug).exists():
        order_items.quantity += 1
        order_items.save()
    else:
        order.items.add(order_items)
        return redirect('product_detail', slug=item.slug)
 else:
    ordered_date = timezone.now()
    order = Order.objects.create(user=request.user, ordered_date=ordered_date)
    order.items.add(order_items)
 return redirect('product_detail', slug=item.slug)

但是当我使用 add_to_cart 函数时会显示如下错误:

int() argument must be a string, a bytes-like object or a number, not 'OrderItem'

标签: pythondjango

解决方案


.get_or_create(…)方法 [Django-doc]返回一个 2 元组,第二个元素是一个布尔值,指定它是否创建一个新对象。因此,您可以解压缩 2-tuple 以获得第一项:

order_items, __ = OrderItem.objects.get_or_create(
    item=item,
    user=request.user,
    ordered=False
)

然而,由于这是一个单数项,您可能希望将 重命名为order_itemsorder_item明确表示这是一个OrderItem对象,而不是OrderItems 的集合。


推荐阅读