python - 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'
解决方案
.get_or_create(…)
方法 [Django-doc]返回一个 2 元组,第二个元素是一个布尔值,指定它是否创建一个新对象。因此,您可以解压缩 2-tuple 以获得第一项:
order_items, __ = OrderItem.objects.get_or_create(
item=item,
user=request.user,
ordered=False
)
然而,由于这是一个单数项,您可能希望将 重命名为order_items
以order_item
明确表示这是一个OrderItem
对象,而不是OrderItem
s 的集合。
推荐阅读
- php - 通过 ajax 使用 wordpress 获取视频
- javascript - 尝试将回调示例重写为 Promise 时修复错误
- git - 查找哪个 git commit 删除一些文件内容
- ruby-on-rails - 禁止在生成的 PDF 上打印(通过 prawn + combine_pdf)
- cobol - COBOL 中的 COMP VALUE ZERO 是什么意思?
- sql - 连接 XML 嵌套 SQL
- python - 如何使用 Celery(无第三方包)发送 Django 的密码重置邮件?
- javascript - 由于 Bootstrap,javascript GET 和 POST 方法不起作用
- sse - 用另一个字节替换一个字节
- .net-core - 在跨平台的 .NET Core 可执行文件中,如何指定本机依赖项的路径/将它们放在哪里?