Django Rest Framework - Сериализация вложенных объектов
У меня есть входной JSON, который я хотел бы правильно выразить в Django Model, чтобы он был правильно сериализован Django Rest Framework.
- объект MainObject имеет свойство name и список условий;
- каждое условие состоит ровно из 2 блоков: left и right;
- каждый блок состоит из 1 поля title и списка user_params.
{
"name": "The Main Object Name",
"conditions": [
{
"left": {
"title": "Title1",
"user_params": [
{
"name": "name_param_X",
"value": "100"
}
]
},
"right": {
"title": "Title2",
"user_params": [
{
"name": "name_param_Y",
"value": "200"
}
]
}
}
]
}
А вот мои модели:
class MainObject(models.Model):
main_object_id = models.UUIDField(primary_key=True, default=uuid.uuid4)
name = models.CharField(max_length=64)
class Condition(models.Model):
condition_id = models.UUIDField(
primary_key=True, default=uuid.uuid4, editable=False, unique=True)
main_object = models.ForeignKey(MainObject, related_name="conditions",
on_delete=models.CASCADE)
left = models.OneToOneField(Block, on_delete=models.CASCADE, null=True, related_name='left')
right = models.OneToOneField(Block, on_delete=models.CASCADE, null=True, related_name='right')
class Block(models.Model):
title = models.CharField(max_length=16, primary_key=True)
class BlockParam(models.Model):
name = models.CharField(max_length=32)
value = models.IntegerField()
block_title = models.ForeignKey(Block, related_name="user_params",
on_delete=models.CASCADE)
Мои сериализаторы:
class ConditionSerializer(serializers.ModelSerializer):
condition_id = serializers.UUIDField(required=False)
class Meta:
model = Condition
fields = ('condition_id', 'left', 'right')
class MainObjectSerializer(serializers.ModelSerializer):
conditions = ConditionSerializer(many=True)
def create(self, validated_data):
conditions_data = validated_data.pop("conditions")
main_object = MainObject.objects.create(**validated_data)
for condition_data in conditions_data:
Condition.objects.create(main_object=main_object, **condition_data)
return main_object
Проблема : когда я делаю POST запрос для создания MainObject с вышеупомянутым вводом JSON, я получаю ответ 400 Bad с таким сообщением:
{
"conditions": [
{
"left": [
"Invalid pk \"{'title': 'Title1', 'user_params': [{'name': 'name_param_x', 'value': '100'}]}\" - object does not exist."
],
"right": [
"Invalid pk \"{'title': 'Title2', 'user_params': [{'name': 'name_param_y', 'value': '200'}]}\" - object does not exist."
]
}
]
}
Мои вопросы:
- Правильно ли смоделированы модели в соответствии с желаемой входной структурой JSON?
- Нужно ли мне модифицировать сериализаторы, чтобы заставить их работать?