如何在ObjectSerialized上设置特定的queryset

2024-09-28 05:27:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用django1.11和djangorest框架的当前版本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对象,Resposta对象有一个“tipo”属性值为“alt”并且与Pergunta对象链接

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

一个响应对象通过一个ForeignKey链接到一个Pergunta对象,一个Pergunta对象通过一个ForeignKey链接到一个问题对象

一个问题对象可以有一个或多个Pergunta对象,一个Pergunta对象可以有一个或多个Resposta对象

当您在rest URL中执行GET时,最终的JSON将从Questionario对象开始,并将级联到最后一个Pergunta对象

请帮我找到一个答案,我无法找到一个在其余的文档,因为我不知道我需要寻找

致以最诚挚的问候


Tags: 对象idtrueonlyfieldsreaddatamodel
1条回答
网友
1楼 · 发布于 2024-09-28 05:27:53

你需要的是一个SerializerMethodField()。你可以通读这些文件来获得更多的信息

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

像这样的方法应该很管用:

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

如果有用的话请告诉我

相关问题 更多 >

    热门问题