Django REST, сериализация переменной / нескольких вложенных отношений OnetoOne - PullRequest
0 голосов
/ 30 октября 2019

Извиняюсь, если название неясно относительно того, в чем заключается проблема, я не уверен, как ее описать.

У меня есть «родительская» модель опроса, которая содержит мои общие поля, общие для всех опросов. .

class Survey(models.Model):
    ...

Однако, в зависимости от типа опроса, требуются дополнительные / разные поля

class SurveyA(models.Model):
    survey = models.OneToOneField(
        Survey,
        on_delete=models.CASCADE,
        primary_key=True
    )
    fieldA = models.TextField()

class SurveyB(models.Model):
    survey = models.OneToOneField(
        Survey,
        on_delete=models.CASCADE,
        primary_key=True
    )
    fieldC = models.TextField()

class SurveyN(models.Model):
    survey = models.OneToOneField(
        Survey,
        on_delete=models.CASCADE,
        primary_key=True
    )
    fieldN = models.TextField()

Когда я сериализую объект "Съемка" в json, мне потребуется соответствующий SurveryA, B..N объект, который должен быть сериализован вместе с ним, независимо от того, какой тип под-опроса связан с OnetoOneField. Это выполнимо?

Ожидаемый результат при сериализации всех моделей Survey:

[
    {
        "id": 1,
        "SurveyA": {
            "fieldA": "this is an 'A' type Survey",
        }
    },
    {
        "id": 2,
        "SurveyB": {
            "fieldB": "this is an 'B' type Survey",
        }
    },
    {
        "id": 3,
        "SurveyN": {
            "fieldN": "this is an 'N' type Survey",
        }
    }
]

1 Ответ

0 голосов
/ 30 октября 2019

Нашли решение, используя SerializeMethodField , если у кого-либо есть какие-либо другие предложения, оно будет высоко оценено.

Идея из Условное поле Django Rest Framework на Serializer

class SurveySerializer(serializers.HyperlinkedModelSerializer):
    survey_type = serializers.SerializerMethodField()
    class Meta:
        model = Survey
        fields = '__all__'

    def get_survey_type(self, obj):
        if SurveyA.objects.filter(pk=obj.pk).exists():
            survey_type = SurveyASerializer(SurveyA.objects.get(pk=obj.pk), context=self.context)
        elif SurveyB.objects.filter(pk=obj.pk).exists():
            survey_type = SurveyBSerializer(SurveyB.objects.get(pk=obj.pk), context=self.context)
        elif SurveyN.objects.filter(pk=obj.pk).exists():
            survey_type = SurveyNSerializer(SurveyN.objects.get(pk=obj.pk), context=self.context)
        return survey_type.data

Примечание: context=self.context необходимо передать, потому что я работаю с гиперссылочными моделями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...