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