我正在使用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文档中找到答案,因为我不知道我需要查找什么。
最好的问候。
答案 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
请告诉我这是否有帮助!