如何在ObjectSerializerModel上设置特定的查询集

时间:2018-05-25 18:50:30

标签: python django django-rest-framework

我正在使用Django 1.11和当前版本的Django Rest Framework(3.8.2)开发一个Web系统。

我在这个项目中提供模型的JSON时遇到了问题。我需要传递一个包含特定属性的JSON。

我将举例说明我的serializers.py,以便更容易理解我的问题。

class LikertSerializerModel(serializers.ModelSerializer):    
    class Meta:
        model = Likert
        fields = ('id', 'escala')

class RespostaSerializerModel(serializers.ModelSerializer):
    likerts = LikertSerializerModel(many = True, read_only = True)

    class Meta:
        model = Resposta
        fields = ('id', 'resposta','tipo', 'foto', 'pergunta', 'qtd_escolhida', 'classificacao_escala', 'data', 'likerts')

class PerguntaSerializerModel(serializers.ModelSerializer):
    respostas = RespostaSerializerModel(read_only=True ,many=True)

    class Meta:
        model = Pergunta
        fields = ('id', 'pergunta', 'tipo_questao', 'questionario', 'respondida', 'data_inicial', 'data_final',
                  'obrigatoria', 'outros', 'ordem', 'qtd_max_caracteres', 'respostas')

class QuestionarioSerializerModel(serializers.ModelSerializer):
    entrevistadores = UsuarioSerializer(many = True, read_only = True)
    sub_administrador = UsuarioSerializer(read_only= True)
    perguntas = PerguntaSerializerModel(many = True, read_only = True)

    class Meta:
        model = Questionario
        fields = ('id', 'titulo', 'descricao', 'data', 'duracao', 'localizacao', 'sub_administrador', 'entrevistadores', 'perguntas')

问题:请参阅PerguntaSerializerModel中我有这个字段“respostas”。事实是,我只想传递给Pergunta对象,具有“tip”属性且值为“alt”并与Pergunta对象链接的Resposta对象。

PS:如果您需要解释这些类是如何链接的,那么它(我们可以忽略Likert对象,因为它对问题毫无用处):

Resposta对象通过ForeignKey链接到单个 Pergunta对象 Pergunta对象通过ForeignKey链接到单个 Questionario对象

Questionario对象可以有一个或多个 Pergunta对象 Pergunta对象可以有一个或多个 Resposta对象

当你在其余的URL中进行GET时,最终的JSON将以Questionario对象开始,并将级联到最后一个Pergunta对象。

请帮我找一个答案,我无法在REST文档中找到答案,因为我不知道我需要查找什么。

最好的问候。

1 个答案:

答案 0 :(得分:1)

这里需要的是SerializerMethodField()。您可以通过文档阅读更多信息。

在序列化程序PerguntaSerializerModel上创建一个方法,该方法根据属性Resposta返回tipo个对象的筛选查询集。

这样的事应该可以正常工作:

class PerguntaSerializerModel(serializers.ModelSerializer):

    respostas = serializers.SerializerMethodField()

    class Meta:
        model = Pergunta
        fields = ('id', 'pergunta', 'tipo_questao', 'questionario', 'respondida', 'data_inicial', 'data_final',
                  'obrigatoria', 'outros', 'ordem', 'qtd_max_caracteres', 'respostas')

    def get_respostas(self, obj):
           reposta_qs = obj.filter(reposta__tipo='alt')
           resposta_serailizer = RespostaSerializerModel(reposta_qs, read_only=True ,many=True)
           return resposta_serailizer.data

请告诉我这是否有帮助!