【问题标题】:Serializing Foreign Key Objects with Django-HVAD TranslatedFields使用 Django-HVAD TranslatedFields 序列化外键对象
【发布时间】:2016-06-17 15:19:06
【问题描述】:

我看到 SO 上有 several questions 关于 Django 上的序列化,但我有额外的复杂性,因为我的字段已翻译(使用 django-hvad)。

我有一些工作,但我认为它的效率非常低,而且由于我是 Django 新手,想知道是否有更好的方法。

我现在正在做的是获取我需要的三个模型中的每一个(Survey、SurveyQuestion、SurveyAnswer),分别对每个模型进行序列化,然后在转换为 JSON 之前将它们组合在一起。

这样做的效果是有效的,如在 django shell 中所见:

>>> 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>]}]

这是相关代码。如果您需要查看更多信息,请告诉我:

views.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']

【问题讨论】:

    标签: django serialization django-rest-framework django-hvad


    【解决方案1】:

    我自己想通了。显然,这与未翻译的模型没有什么不同,只是我以前没有。

    以下是正确工作的正确代码。请注意每个序列化程序的顺序以及反向外键字段作为序列化程序的包含。

    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']
    

    views.py

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

    编辑:

    事实证明这并不完全有效。在这种情况下,Survey 对象被正确翻译,但外键引用的对象,如 SurveyQuestionSurveyAnswer,没有被翻译。这意味着您会得到混合的翻译和未翻译结果。

    【讨论】:

      猜你喜欢
      • 2012-05-17
      • 2011-04-14
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      相关资源
      最近更新 更多