TypeError:无法在 Django REST 框架中解压不可迭代的 int 对象
Posted
技术标签:
【中文标题】TypeError:无法在 Django REST 框架中解压不可迭代的 int 对象【英文标题】:TypeError: cannot unpack non-iterable int object in Django rest framework 【发布时间】:2021-06-17 18:25:45 【问题描述】:我正在尝试获取仅与该商家关联的那些产品的订单列表。在我的项目中,每个产品都与一个商家相关联。在商家控制面板中,商家应该只能查看他们的产品和订单。
当我尝试根据与该商家关联的产品过滤订单时,出现上述错误。
我的模型:
class Product(models.Model):
merchant = models.ForeignKey(Seller,on_delete=models.CASCADE,blank=True,null=True)
category = models.ManyToManyField(Category, blank=False)
brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
class Order(models.Model):
ORDER_STATUS = (
('To_Ship', 'To Ship',),
('Shipped', 'Shipped',),
('Delivered', 'Delivered',),
('Cancelled', 'Cancelled',),
)
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
#items = models.ManyToManyField(OrderItem,blank=True, null=True,related_name="order_items")
#start_date = models.DateTimeField(auto_now_add=True)
order_status = models.CharField(max_length=50,choices=ORDER_STATUS,default='To_Ship')
ordered_date = models.DateTimeField(auto_now_add=True)
ordered = models.BooleanField(default=False)
total_price = models.CharField(max_length=50,blank=True,null=True)
#billing_details = models.OneToOneField('BillingDetails',on_delete=models.CASCADE,null=True,blank=True,related_name="order")
def __str__(self):
return self.user.email
class Meta:
verbose_name_plural = "Orders"
ordering = ('-id',)
class OrderItem(models.Model):
#user = models.ForeignKey(User,on_delete=models.CASCADE, blank=True)
order = models.ForeignKey(Order,on_delete=models.CASCADE, blank=True,null=True,related_name='order_items')
item = models.ForeignKey(Product, on_delete=models.CASCADE,blank=True, null=True)
order_variants = models.ForeignKey(Variants,on_delete=models.CASCADE,blank=True,null=True)
quantity = models.IntegerField(default=1)
total_item_price = models.CharField(max_length=50,blank=True,null=True)
def __str__(self):
return f"self.quantity items of self.item of self.order.user"
class Meta:
verbose_name_plural= "Cart Items"
ordering = ('-id',)
我的看法:
class SellerOrderAPIView(ListAPIView):
permission_classes = [AllowAny]
serializer_class = OrderItemSerializer
def get_queryset(self):
merchant = get_object_or_404(Seller,self.kwargs['pk'])
return OrderItem.objects.all(item__merchant=merchant)
我的序列化器:
class OrderItemSerializer(serializers.ModelSerializer):
order_variants = VariantSerializer(read_only=True)
#order_variants =VariantSerializer()
item = ProductSerializer(read_only=True)
class Meta:
model = OrderItem
fields = ['id','order','item','order_variants', 'quantity']
# depth = 1
在这里,我看到当我看到 orderdetails 时,merhchant 在 item 内,这就是为什么我尝试使用 item__merchant=merchant 过滤查询集,但我收到了这个错误。
我的网址:
path('api/merchantorder/<int:pk>', views.SellerOrderAPIView.as_view(), name='api-merchant-orderdetail'),
【问题讨论】:
【参考方案1】:您需要指定过滤字段的名称:
class SellerOrderAPIView(ListAPIView):
permission_classes = [AllowAny]
serializer_class = OrderItemSerializer
def get_queryset(self):
merchant = get_object_or_404(Seller, pk=self.kwargs['pk'])
return OrderItem.objects.filter(item__merchant=merchant)
但是,您可以简单地避免查找并使用:
class SellerOrderAPIView(ListAPIView):
permission_classes = [AllowAny]
serializer_class = OrderItemSerializer
def get_queryset(self):
return OrderItem.objects.filter(item__merchant=self.kwargs['pk'])
【讨论】:
你能告诉我以上两者有什么区别吗?我一直用第一个。 @SarojPaudel:您没有获取Seller
。 Django 将简单地进行 JOIN。唯一的区别是,如果Seller
不存在,那么在第一个视图中它将返回 404,而在第二个视图中它将返回一个空列表。
好的,最后一个问题。这个 JOIN 是什么意思?另外我正在获取卖方,我正在尝试根据该 pk 获取卖方的对象。
@SarojPaudel:它将在数据库上进行 JOIN:w3schools.com/sql/sql_join.asp以上是关于TypeError:无法在 Django REST 框架中解压不可迭代的 int 对象的主要内容,如果未能解决你的问题,请参考以下文章
Django Rest Framework TypeError需要一个类似字节的对象,而不是'str'
TypeError:无法在 Django 视图函数中解压不可迭代的 int 对象
解决django配置swagger后,打开docs报错TypeError:Excepted a ‘coreapi.Document’ instance
django-rest-auth 自定义注册无法保存额外字段