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."
            ]
        }
    ]
}

Мои вопросы:

  1. Правильно ли смоделированы модели в соответствии с желаемой входной структурой JSON?
  2. Нужно ли мне модифицировать сериализаторы, чтобы заставить их работать?
Вернуться на верх