0

Django でのシリアライゼーションに関する SO に関する質問が既にいくつかあるようですが、フィールドが変換されているため (を使用してdjango-hvad)、さらに複雑になっています。

私が持っているものはちょっとうまくいきますが、それは恐ろしく非効率的だと思います.Djangoに慣れていないので、もっと良い方法があるかどうか疑問に思っています.

私が今行っていることは、必要な 3 つのモデル (Survey、SurveyQuestion、SurveyAnswer) のそれぞれを取得し、それぞれを個別にシリアル化し、それらを組み合わせてから JSON に変換することです。

djangoシェルで見られるように、これの効果は機能しています:

>>> qs = models.SurveyQuestion.objects.language('en').all().filter(survey=1)
>>> for q in qs:
...   res.append({'question': q, 'answers' : models.SurveyAnswer.objects.language('en').all().filter(question=q.pk)})
...
>>> res = []
>>> res
[{'question': <SurveyQuestion: Who is the best Beatle?>, 'answers': [<SurveyAnswer: Paul McCartney>, <SurveyAnswer: George Harrison>, <SurveyAnswer: Ringo Starr>]}, {'question': <SurveyQuestion: Which album from The Beatles was the best?>, 'answers': [<SurveyAnswer: Yellow Submarine>, <SurveyAnswer: Revolver>, <SurveyAnswer: The White Album>]}]

関連するコードは次のとおりです。もっと見る必要がある場合はお知らせください:

ビュー.py

class SurveyDetail(APIView):
    """
    Retrieve, update or delete a survey instance.
    """
    def get_object(self, pk):
        try:
            user_language = self.request.GET.get('language')
            return models.Survey.objects.language(user_language).get(pk=pk)
        except models.Survey.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get_related_questions(self, pk):
        try:
            user_language = self.request.GET.get('language')
            return models.SurveyQuestion.objects.language(user_language).all().filter(survey=pk)
        except models.SurveyAnswer.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get_related_answers(self, pk):
        try:
            user_language = self.request.GET.get('language')
            return models.SurveyAnswer.objects.language(user_language).all().filter(question=pk)
        except models.SurveyAnswer.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get(self, request, pk, format=None):
        survey = self.get_object(pk)
        questions = self.get_related_questions(pk)
        res = []
        for q in questions:
            res.append({
                'question': SurveyQuestionSerializer(q).data,
                'answers' : SurveyAnswerSerializer(self.get_related_answers(q.pk), many=True).data
                })
        resp_obj = {
            'survey' : SurveySerializer(survey).data,
            'data' : res
            }

        return JSONResponse(resp_obj)

    def put(self, request, pk, format=None):
        survey = self.get_object(pk)
        serializer = SurveySerializer(survey, data=data)
        if serializer.is_valid():
            serializer.save()
            return JSONResponse(serializer.data)
        return JSONResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        survey = self.get_object(pk)
        survey.delete()
        return HttpResponse(status=status.HTTP_204_NO_CONTENT)

serializers.py

class SurveySerializer(TranslatableModelSerializer):
    class Meta:
        model = models.Survey
        fields = ['pk', 'title', 'description', 'slug']


class SurveyQuestionSerializer(TranslatableModelSerializer):
    # survey = SurveySerializer(required=False)
    class Meta:
        model = models.SurveyQuestion
        fields = ['pk', 'title', 'content', 'slug', 'survey', 'is_multi_select', 'has_other_field', 'required']


class SurveyAnswerSerializer(TranslatableModelSerializer):
    # question = SurveyQuestionSerializer(required=False)
    class Meta:
        model = models.SurveyAnswer
        fields = ['pk', 'title', 'slug', 'question']
4

1 に答える 1

0

私は自分でそれを理解しました。どうやら、未翻訳のモデルと変わらないようで、以前は持っていなかっただけです。

以下は、正しく動作する修正されたコードです。各シリアライザーの順序と、逆外部キー フィールドがシリアライザーとして含まれていることに注意してください。

serializers.py

class SurveyAnswerSerializer(TranslatableModelSerializer):
    class Meta:
        model = models.SurveyAnswer
        fields = ['pk', 'title', 'slug', 'question']

class SurveyQuestionSerializer(TranslatableModelSerializer):
    answers = SurveyAnswerSerializer(many=True)

    class Meta:
        model = models.SurveyQuestion
        fields = ['pk', 'title', 'content', 'slug', 'survey', 'is_multi_select', 'type', 'scale_min','scale_max', 'has_other_field', 'required', 'answers']

class SurveySerializer(TranslatableModelSerializer):
    questions = SurveyQuestionSerializer(many=True)

    class Meta:
        model = models.Survey
        fields = ['pk', 'title', 'description', 'slug', 'questions']

ビュー.py

class SurveyDetail(APIView):
    ...
    def get(self, request, pk, format=None):
        survey = self.get_object(pk)
        serializer = SurveySerializer(survey)
        return JSONResponse(serializer.data)

編集:

これは完全には機能しないことがわかりました。このシナリオでは、Surveyオブジェクトは正しく変換されますが、SurveyQuestionやなどの外部キーによって参照されるオブジェクトSurveyAnswerは変換されません。つまり、翻訳済みの結果と未翻訳の結果が混在しています。

于 2016-03-07T21:02:09.367 に答える