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 自定义注册无法保存额外字段

注册后 Django Rest Framework 无法登录

无法使用视图名称 (django-rest-framework) 解析超链接关系的 URL