Django REST,序列化 variable/multiple 嵌套的 OnetoOne 关系

Django REST, serializing variable/multiple nested OnetoOne relationship

抱歉,如果标题不清楚问题是什么,我不确定如何描述它。

我有一个 "parent" 调查模型,其中包含所有调查共有的一般领域。

class Survey(models.Model):
    ...

然而,根据调查类型,additional/different 个字段是必需的

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()

当我把一个"Survey"object序列化成json的时候,我希望相应的SurveryA,B..Nobject连同它一起序列化,不管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",
        }
    }
]

找到使用 SerializeMethodField 的解决方案,如果有人有任何其他建议,将不胜感激。

想法来自

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 必须通过,因为我正在使用超链接模型。