Django rest framework - Внешний ключ - отношение один ко многим

Для моего проекта мне нужно иметь простой процесс форма => много вопросов => для каждого вопроса тип ответа => если тип ответа - множественный выбор, то возможные ответы находятся в группе uniq. Моя цель состоит в том, чтобы иметь возможность продвигать через DRF/Django rest framework всю исходную форму.

Вот мои модели:

class FormModels(models.Model):

    class Status(models.IntegerChoices):
        DRAFT = 1, _("DRAFT")
        PUBLISHED = 2, _("PUBLISHED")
        ARCHIVED = 5, _("ARCHIVED")

    form_name = models.CharField(unique=True, blank=False, null=False, max_length=255)
    form_model = models.CharField(unique=True, blank=False, null=False, max_length=255)
    status = models.IntegerField(choices=Status.choices, blank=False, null=False, default=1)

    def __str__(self):
        return self.form_name

class FormResponseTypeModels(models.Model):
    
    class Type(models.IntegerChoices):
        TEXT = 1, _('TEXT')
        MULTICHOICE = 2, _('MULTI')

    type = models.IntegerField(choices=Type.choices, blank=False, null=False, default=1)
    group = models.IntegerField(blank=False, null=True, default=1)

    def __str__(self):
        return str(self.type)

    class Meta:
        constraints = [
            UniqueConstraint(fields=['group'], name='unique_group')
        ]

class MultipleChoiceDataModels(models.Model):
    
    text = models.CharField(blank=False, null=False, max_length=255)
    value = models.CharField(blank=False, null=False, max_length=255)
    order = models.IntegerField(blank=False, null=False, default=1)
    group_refid = models.ForeignKey(blank=False,
                                    null=False,
                                    default=1,
                                    to=FormResponseTypeModels,
                                    to_field="group",
                                    related_name="groups",
                                    on_delete=models.PROTECT)

    def __str__(self):
        return self.text

class FormQuestionModels(models.Model):
    
    form_id = models.ForeignKey(to=FormModels, on_delete=models.PROTECT)
    form_response_type = models.ForeignKey(to=FormResponseTypeModels, on_delete=models.PROTECT, related_name="test")
    form_question = models.TextField(max_length=2000)

    def __str__(self):
        return self.form_question

Вот мой serializers.py

Ожидаемый результат:

{
"form_name": "test7",
"form_model": "test7",
"status": 1,
"questions": [
    {
        "form_question": "q1",
        "form_response_type_set": {
            "type": 1,
            "group": [
                {
                    "text": "a",
                    "value": "1",
                    "order": 1,
                    "group_refid": 1
                }
            ]
        }
    },
    {
        "form_question": "q2",
        "form_id": {
            "form_name": "form_name",
            "form_model": "form_model",
            "status": 1
        },
        "form_response_type_set": {
            "type": 1,
            "group": [
                {
                    "text": "a",
                    "value": "1",
                    "order": 1,
                    "group_refid": 1
                }
            ]
        }
    }
]

}

Но для групповой части я не могу заставить ее отображаться. Я получил:

"questions": [
            {
                "id": 1,
                "form_question": "q1",
                "form_id": {
                    "id": 1,
                    "form_name": "t1",
                    "form_model": "t1",
                    "status": 2
                },
                "form_response_type": {
                    "id": 1,
                    "type": 1,
                    "group": null
                }
            },
            {
                "id": 2,
                "form_question": "q2",
                "form_id": {
                    "id": 1,
                    "form_name": "t1",
                    "form_model": "t1",
                    "status": 2
                },
                "form_response_type": {
                    "id": 2,
                    "type": 2,
                    "group": 1
                }
            }
        ],
        "form_name": "t1",
        "form_model": "t1",
        "status": 2
    }
]

При использовании оболочки django shell я получаю такой результат:

FormResponseTypeSerializer():
id = IntegerField(label='ID', read_only=True)
groups = FormMultipleChoiceDataSerializer(many=True, read_only=False, required=False):
    id = IntegerField(label='ID', read_only=True)
    text = CharField(max_length=255)
    value = CharField(max_length=255)
    order = IntegerField(max_value=2147483647, min_value=-2147483648, required=False)
    group_refid = NestedSerializer(read_only=True):
        id = IntegerField(label='ID', read_only=True)
        type = ChoiceField(choices=[(1, 'TEXT'), (2, 'MULTI')], required=False, validators=[<django.core.validators.MinValueValidator object>, <django.core.validators.MaxValueValidator object>])
        group = IntegerField(allow_null=True, max_value=2147483647, min_value=-2147483648, required=False)
type = ChoiceField(choices=[(1, 'TEXT'), (2, 'MULTI')], required=False, validators=[<django.core.validators.MinValueValidator object>, <django.core.validators.MaxValueValidator object>])
group = IntegerField(allow_null=True, max_value=2147483647, min_value=-2147483648, required=False)

Я пробовал использовать источник и связанное имя, множество типов сериализаторов, синтаксис _set для источника varialbe ... , прочитал 40+ stack overflow threads, но каждый раз я застреваю на этом (также, если это имеет значение, я хотел бы иметь возможность постить новую форму сразу с той же конечной точкой)

Не могли бы вы указать мне на мою ошибку?

Я не уверен, что я сделал, чтобы это сработало, но после множества попыток, используя related_name в моделях, изменив имя полей, чтобы избежать использования text, value и order, удалив базу данных и применив миграции снова, установил depth=1 для каждого родительского сериализатора. Теперь все работает! Если у кого-то есть хорошее объяснение, я был бы рад прочитать его и научиться!

Вернуться на верх