2

我围绕调查的前提构建了以下三个模型。

class Survey(models.Model):
   ...
   id = models.UUIDField(_('Id'), primary_key=True, default=uuid.uuid4, editable=False,)
   name = models.CharField(_('Name'), max_length=120, blank=True, unique=True)
   slug = models.SlugField(_('Slug'), max_length=120, blank=True, unique=True)
   description = models.TextField(_('Description'), blank=True)
   ...

每个调查可以有多个问题SurveyQuestion

class SurveyQuestion(models.Model):
    ...
    survey = models.ForeignKey('surveys.Survey', on_delete=models.CASCADE, null=True, blank=True,)

每个 SurveyQuestion 可以有多个答案SurveyQuestionAnswer

class SurveyQuestionAnswer(models.Model):
    ...
    survey_question = models.ForeignKey('surveys.SurveyQuestion', on_delete=models.CASCADE, null=True, blank=True,)

为了简洁起见,想象我的调查序列化程序尽可能简单:

class SurveySerialializer(serializers.ModelSerializer):

    class Meta:
        model = Survey
        fields = ('__all__')

实际上,我所拥有的是以下内容:

class Survey(APIView):
    """
        Survey GET request endpoint: fetches Survey
    """
    permission_classes = User

    def get(self, request, survey_slug):

        survey = Survey.objects.get(slug=survey_slug)

        serializer = SurveySerializer(survey)

        response = get_hug_response(message='Organisation Active Survey Fetched Successfully', data=serializer.data)
        return Response(data=response, status=status.HTTP_200_OK)

但是,正如您可能都知道的那样,相应的surveys.get('slug')fetch 只返回Survey模型中的字段。理想情况下,我希望为 each 获取某种 fetch SurveyQuestion,并在其中嵌套SurveyQuestionAnswers

任何专业提示和指示将不胜感激。

我尝试了一些东西,只会抛出错误。我很难知道这种类型的 API 关系在 DRF 中被称为什么,所以我找不到合适的示例指南来基于相同的原则......

相关版本:

Django==2.2.1
djangorestframework==3.9.3
4

1 回答 1

3

创建两个序列化程序,SurveyQuestionAnswerSerializerSurveyQuestionSerializer

class SurveyQuestionAnswerSerializer(serializers.ModelSerializer):
    class Meta:
        model = SurveyQuestionAnswer
        fields = '__all__'


class SurveyQuestionSerializer(serializers.ModelSerializer):
    survey_questionanswers = SurveyQuestionAnswerSerializer(many=True, read_only=True, source="surveyquestionanswer_set")

    class Meta:
        model = SurveyQuestion
        fields = '__all__'


class SurveySerializer(serializers.ModelSerializer):
    survey_questions = SurveyQuestionSerializer(many=True, read_only=True, source="surveyquestion_set")

    class Meta:
        model = Survey
        fields = '__all__'

欲了解更多信息,
1 . Django中的用途是什么?related_name
2. DRF Serializer 的source论点

于 2019-08-12T09:22:20.897 回答