Создание объекта и дочерних объектов в DRF - PullRequest
0 голосов
/ 17 июня 2020

У меня есть 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"
        }
    ]
}

И он выдает следующее ошибка:

KeyError в / api / v1 / order / 'detail'

Метод запроса: URL-адрес запроса 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)
...