如何使用嵌套数据DRF创建序列化程序?

2024-04-26 17:41:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我看过很多关于嵌套序列化程序的教程,但不幸的是我无法解决这个问题。请给我一些提示

我需要创建这个JSON

{
        "external_id": "11",
        "details": [
            {
                "amount": 7,
                "price": "12.00",
                "product": {
                    "name": "Car"
                }
            }
        ]
    }

我的模型包括下一个相关模型:

from django.db import models


class Order(models.Model):
    NEW = 'new'
    ACCEPTED = 'accepted'
    FAILED = 'failed'

    order_status = [
        (NEW, 'new'),
        (ACCEPTED, 'accepted'),
        (FAILED, 'failed'),
    ]

    status = models.CharField(max_length=12, choices=order_status, default='new', blank=False)
    created_at = models.DateTimeField(auto_now_add=True)
    external_id = models.CharField(max_length=128)

    def __str__(self):
        return f'Order № {self.external_id}'


class Product(models.Model):
    name = models.CharField(max_length=64)

    def __str__(self):
        return self.name


class OrderDetail(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE,
                              related_name='details',
                              null=True, blank=True)

    amount = models.IntegerField(null=True, blank=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE,
                                related_name='product',
                                null=True)
    price = models.DecimalField(decimal_places=2, max_digits=6, null=True, blank=True)

    def __str__(self):
        return f'Detail for {self.order}, detail for product {self.product}'

我的看法

class ProductViewSet(ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

class OrderViewSet(ModelViewSet):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer
    pagination_class = ContentRangeHeaderPagination

class OrderDetailViewSet(ModelViewSet):
    queryset = OrderDetail.objects.all()
    serializer_class = OrderDetailSerializer

我的序列化程序

class OrderDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = OrderDetail
        fields = ['id', 'amount', 'price']
        depth = 1


class ProductSerializer(serializers.ModelSerializer):
    product = OrderDetailSerializer(many=True)

    class Meta:
        model = Product
        fields = ['id', 'name', 'product']

class OrderSerializer(serializers.ModelSerializer):
    details = OrderDetailSerializer(many=True)

    class Meta:
        model = Order
        fields = ['id', 'status', 'created_at', 'external_id', 'details']
        depth = 2

    def create(self, validated_data):  # works for first nesting
        print(validated_data)
        details_data = validated_data.pop('details')  
        request = Order.objects.create(**validated_data)

        for detail_data in details_data:  # 
            products_data = detail_data.pop('product')
            request_detail = OrderDetail.objects.create(order=request, **detail_data)

            for product_data in products_data:
                Product.objects.create(product=request_detail, **product_data)

        return request

我尝试发送POST请求时出错=&燃气轮机;KeyError“产品” 我想使用循环获取产品字段。但是我不能得到这个字段,因为我没有识别它。 我的问题是:如何在OrderSerializer中接收此字段。 谢谢你的回答