Объект типа 'Product' не поддерживает сериализацию в формате JSON - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь вытащить из моего приложения через Django. Проблема в том, что когда я вызываю детали заказа через мои сериализаторы, я получаю эту ошибку:

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})

Я не уверен, что нужно сделать.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вам необходимо создать сериализатор для свойства продукта, которое вы объявили в модели OrderDetail. Если вы этого не сделаете, он выдаст эту ошибку, потому что свойство продукта возвращает объект класса 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")
0 голосов
/ 08 мая 2018

Поскольку свойство product модели OrderDetail возвращает объект 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...