【问题标题】:Object of type 'Product' is not JSON serializable“产品”类型的对象不是 JSON 可序列化的
【发布时间】:2018-10-17 23:10:19
【问题描述】:

我正在尝试通过 Django 从我的应用程序中提取。问题是当我通过序列化程序调用 Order Detail 时,我收到此错误:

TypeError at /api/customer/order/latest/
Object of type 'Product' is not JSON serializable
Request Method: GET
Request URL:    http://localhost:8000/api/customer/order/latest/?access_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Django Version: 1.10
Exception Type: TypeError
Exception Value:    
Object of type 'Product' is not JSON serializable

我正在从这个模型中提取数据:

class OrderDetail(models.Model):
    order = models.ForeignKey(Order, related_name='order_details')
    product_size = models.ForeignKey(ProductSize)
    quantity = models.IntegerField()
    sub_total = models.FloatField()

    def __str__(self):
        return str(self.id)

# references Prodcut and allows old code to work.
    @property
    def product(self):
        return self.product_size.product

这是被拉取的:

'order_details': [OrderedDict([('id', 68),
                                ('product_size', 44),
                                ('quantity', 1),
                                ('sub_total', 20.0),
                                ('product', <Product: Bacon Burger - withDrink>)])],
 'status': 'Your Order Is Being Picked Right Off The Plant!',
 'total': 20.0}
request 
<WSGIRequest: GET '/api/customer/order/latest/?access_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXX'>

序列化器:

class OrderDetailSerializer(serializers.ModelSerializer):

    class Meta:
        model = OrderDetail
        fields = ("id", "product_size", "quantity", "sub_total", "product")


class OrderSerializer(serializers.ModelSerializer):
    customer = OrderCustomerSerializer()
    driver = OrderDriverSerializer()
    restaurant = OrderRestaurantSerializer()
    order_details = OrderDetailSerializer(many = True)
    status = serializers.ReadOnlyField(source= "get_status_display")

    class Meta:
        model = Order
        fields = ("id", "customer", "restaurant", "driver", "order_details", "total", "status", "address")

函数详情:

def customer_get_latest_order(request):
    access_token = AccessToken.objects.get(token = request.GET.get("access_token"),
    expires__gt = timezone.now())

    customer = access_token.user.customer
    order = OrderSerializer(Order.objects.filter(customer = customer).last()).data

    return JsonResponse({"order": order})

我不确定需要做什么。

【问题讨论】:

  • 可以添加视图吗?
  • @neverwalkaloner 添加功能

标签: django rest django-rest-framework


【解决方案1】:

由于OrderDetail模型的product属性返回Product对象,在响应过程中无法序列化。

要修复它,您只需返回 product.id:

class OrderDetail(models.Model):
    order = models.ForeignKey(Order, related_name='order_details')
    product_size = models.ForeignKey(ProductSize)
    quantity = models.IntegerField()
    sub_total = models.FloatField()

    def __str__(self):
        return str(self.id)

    @property
    def product(self):
        return self.product_size.product.id

或者,如果您需要产品的详细信息作为响应,您应该在OrderDetailSerializer 中再添加一个嵌套序列化程序:

class ProductSerializer(serializers.ModelSerializer):

    class Meta:
        model = Product
        fields = ("id", "other fields")

class OrderDetailSerializer(serializers.ModelSerializer):
    prodcut = ProductSerializer()

    class Meta:
        model = OrderDetail
        fields = ("id", "product_size", "quantity", "sub_total", "product")

【讨论】:

    【解决方案2】:

    您需要为您在 OrderDetail 模型中声明的产品属性创建一个序列化程序。如果你不这样做,它会给出这个错误,因为 product 属性返回一个 Product 类的对象并且它不知道如何序列化它。创建序列化程序后,请执行以下操作

    class OrderDetailSerializer(serializers.ModelSerializer):
        product=ProductSerializer(read_only=True, many=False) # you need to do this
        class Meta:
            model = OrderDetail
            fields = ("id", "product_size", "quantity", "sub_total", "product")
    

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2021-07-04
      • 2021-12-10
      • 1970-01-01
      • 2021-09-27
      • 2019-09-04
      相关资源
      最近更新 更多