首页 > 解决方案 > 在 DRF 中创建对象和子对象

问题描述

我有 2 个序列化器,Order 和 OrderDetail:

class OrderSerializer(serializers.ModelSerializer):
    detail = serializers.SerializerMethodField()

    class Meta:
        model = Order
        fields = ['pk', 'user', 'date', 'status', 'detail ']


    def create(self, validated_data):

        order= Order.objects.create(**validated_data)
        detail_data = validated_data.pop('detail')

        if detail_data :
            for detail in detail_data :
                OrderDetail.objects.create(order=order, **detail)
        return order

    def get_detail(self, obj):
        """obj is an order instance. Return list of dicts"""
        queryset = OrderDetail.objects.filter(order= obj)
        return [OrderDetailSerializer(m).data for m in queryset]

class OrderDetailSerializer(serializers.ModelSerializer):
    """ Just in case if its needed for create for multiple instances """
    def __init__(self, *args, **kwargs):
        many = kwargs.pop('many', True)
        super(OrderDetailSerializer, self).__init__(many=many, *args, **kwargs)

    order = serializers.PrimaryKeyRelatedField(queryset=Order.objects.all())
    product = serializers.PrimaryKeyRelatedField(queryset=Product.objects.all())

    class Meta:
        model = OrderDetail
        fields = ['pk', 'order', 'product', 'quantity','individual_price']

在邮递员中,我发送:

{
    "user": 1,
    "date": "2020-06-02",
    "status": "Approved",
    "detail": [
        {
            "product": 2,
            "quantity": "3",
            "individual_price": "15.00"
        },
        {
            "product": 1,
            "quantity": "1",
            "individual_price": "10.00"
        }
    ]
}

它会引发以下错误:

/api/v1/order/'detail' 处的 KeyError

请求方式:POST 请求网址:http://localhost:8000/api/v1/order/ Django 版本:3.0.3

当我打印数据时,它显示:

{'user': <User: test>, 'date': datetime.date(2020, 6, 3), 'status': 'Approved'}

似乎详细它是一个只读字段,不知道它是否用于 SerializerMethodField。关于这一点,我需要 SerializerMethodField 的详细信息来格式化响应,如下所示:

results": [
        {
            "pk": 1,
            "user": 1,
            "date": "2020-06-03",
            "status": "Approved",
            "detail": [
                {
                    "pk": 2,
                    "order": 1,
                    "product": 2,
                    "quantity": "3",
                    "individual_price": "15.00"
                },
                {
                    "pk": 3,
                    "order": 1,
                    "product": 1,
                    "quantity": "1",
                    "individual_price": "10.00"
                }
            ]
        },

我也在视图中使用 ListCreateAPIView 并且模型具有与序列化程序中的字段相同的信息

class OrderList(generics.ListCreateAPIView):
    """
        Returns orders by user
    """
    queryset = Order.objects.all()
    serializer_class = OrderSerializer
    permission_classes = [IsAuthenticated]
    authentication_classes = [TokenAuthentication, SessionAuthentication]

    def get_queryset(self):
        user = self.request.user
        return Order.objects.filter(user=user)

标签: pythondjangodjango-rest-framework

解决方案


推荐阅读