首页 > 解决方案 > Django Rest Framework Serializer 不打印嵌套关系

问题描述

我已经建立了 2 个模型之间的关系:OrderOrderLine. 我按照 DRF 文档为它们创建了序列化程序,但是在打印serializer.data嵌套对象时没有显示。

这是我的模型:

class Order(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    session_id = models.CharField(max_length=256)  

class OrderLine(models.Model):
    order_id = models.ForeignKey(Order, on_delete=models.DO_NOTHING)
    product_id = models.ForeignKey(Product, on_delete=models.DO_NOTHING)
    price = models.DecimalField(decimal_places=2, max_digits=20)
    quantity = models.IntegerField()
    total = models.DecimalField(decimal_places=2, max_digits=20)


    created_at = models.DateField(auto_now_add=True)
    updated_at = models.DateField(auto_now=True)

这些是序列化程序:

from rest_framework import serializers

from .models import Order, OrderLine


class OrderLineSerializer(serializers.ModelSerializer):
    """
    OrderLine serializer
    """
    class Meta:
        model = OrderLine
        fields = ['product_id', 'price', 'quantity', 'total']
    


class OrderSerializer(serializers.ModelSerializer):
    """
    Order serializer
    """
    items = OrderLineSerializer(many=True, read_only=True)

    class Meta:
        model = Order
        fields = ['session_id', 'subtotal', 'total', 'items']
        read_only_fields = ['id']

这是视图:

class OrderAPIViewSet(viewsets.ViewSet):

    def create(self, request):

        order = Order.objects.create(session_id=request.data['session_id'])

        for item in request.data['items']:
            product = Product.objects.get(pk=item['product_id'])
            total = Decimal(item['price'] * item['quantity']) 
            OrderLine.objects.create(
                order_id=order,
                product_id=product,
                price=Decimal(item['price']),
                quantity=item['quantity'],
                total=total
            )

        serializer = OrderSerializer(instance=order)
        print("HERE")
        print(serializer.data)

        return Response(status=status.HTTP_200_OK)

从我的 REST 客户端,我发布了以下对象:

{
            "session_id":uuid,
            "items": [
                {
                    "product_id": product.id,
                    "price": 5.80,
                    "quantity": 2,
                }
            ]
            
        }

但是当视图中的打印语句被执行时,这就是正在打印的内容:

{
   "session_id":"4def7bdb-dedb-46aa-9c70-1d9e4f522149",
   "subtotal":"0.00",
   "total":"0.00"
}

请注意未包含项目子资源。

我错过了什么?

标签: djangoserializationdjango-rest-frameworkdjango-serializerdjango-rest-viewsets

解决方案


因为您将read_only=True参数传递给OrderLineSerializer. 当您的序列化程序的内置方法to_internal_value()运行时,清除不包括在您的字段列表中的数据。有关更多详细信息:read_only


推荐阅读