Проблема с обработкой вложенного словаря на Django Rest Framework
Тестирую Django Rest Framework. В результате POST запроса на ввод я получаю следующий JSON (здесь важно, что это ключи словаря, остальное мелочи):
{
"title": "Test title10",
"description": "Test description10",
"client": {
"name": "Egor10",
"surname": "Egor11",
"phone": "1645342534532",
"adress": "st. Egor9, 53453"
},
"products": ["Karamel", "Shokolad", "Limon", "Banan"],
"delivery_adress": "st. Egor44",
"delivery_date": "2022-23-09:44:00",
"delivery_code": "4562gdgll"
}
У меня есть две модели:
from django.db import models
class Client(models.Model):
name = models.CharField(max_length=100, blank=True)
surname = models.CharField(max_length=100, blank=True)
phone = models.CharField(max_length=100, blank=True)
adress = models.CharField(max_length=150, blank=True)
class Order(models.Model):
title = models.CharField(max_length=100, blank=True)
description = models.CharField(max_length=255, blank=True)
delivery_code = models.CharField(max_length=50, blank=True)
delivery_adress = models.CharField(max_length=150, blank=True)
client = models.ForeignKey('Client', on_delete=models.CASCADE, null=True, related_name='orders')
Далее я хочу сделать сериализатор и посмотреть в сторону SlugRelatedField или Nested relationships для обработки вложенных словарных отношений:
"client": {
"name": "Egor10",
"surname": "Egor11",
"phone": "1645342534532",
"adress": "st. Egor9, 53453"
}
Для SlugRelatedField я попробовал эту историю в сериализаторе:
class OrderSerializer(serializers.ModelSerializer):
orders = serializers.SlugRelatedField(
read_only=True,
slug_field='phone'
)
class Meta:
model = Order
fields = ['title', 'description', 'delivery_code', 'delivery_adress', 'orders']
В файле views.py я выполняю стандартную обработку:
def post(self, request):
serializer = OrderSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
И вся эта история не работает и чаще всего возникает KeyError: 'client' error, что в общем-то логично.
Подскажите, что я делаю неправильно и куда капать?
Спасибо.
Я думаю, что имя поля должно быть client
, а не orders
.
Имя orders
, которое является related_name
, может быть использовано в модели client
и ее сериализаторе.
class OrderSerializer(serializers.ModelSerializer):
client = serializers.SlugRelatedField(
read_only=True,
slug_field='phone'
)
class Meta:
model = Order
fields = ['title', 'description', 'delivery_code', 'delivery_adress', 'client']