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
必须通过,因为我正在使用超链接模型。
抱歉,如果标题不清楚问题是什么,我不确定如何描述它。
我有一个 "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
必须通过,因为我正在使用超链接模型。