自定义Django Rest的序列化器输出

2 投票
1 回答
1902 浏览
提问于 2025-04-18 07:04

我想要自定义序列化器的输出……

我想在我的序列化器输出中添加一个额外的字段。

我的模型:

class MatchupActivity(models.Model):
    matchup_user = models.ForeignKey(MatchupUser)
    question = models.ForeignKey(Question)
    answer = models.ForeignKey(Answer)
    points = models.PositiveIntegerField()
    time = models.PositiveIntegerField() # in seconds

    def __unicode__(self):
        return u"%d - [%s]" % (self.id, self.matchup_user)

我的序列化器:

class MatchupActivitySerializer(serializers.Serializer):
    """
    """

    url = serializers.HyperlinkedIdentityField(view_name='matchupactivity-detail')
    question = serializers.HyperlinkedRelatedField(queryset=Question.objects.all(), view_name='question-detail')
    answer = serializers.HyperlinkedRelatedField(queryset=Answer.objects.all(), view_name='answer-detail')
    points = serializers.IntegerField(required=True)
    time = serializers.IntegerField(required=True)
    matchup = serializers.HyperlinkedRelatedField(queryset=Matchup.objects.all(), view_name='matchup-detail')

    def to_native(self, obj):
        if 'matchup' in self.fields:
            self.fields.pop('matchup')
        return super(MatchupActivitySerializer, self).to_native(obj)

    def restore_object(self, attrs, instance=None):
        request = self.context.get('request')
        field = serializers.HyperlinkedRelatedField(queryset=Matchup.objects.all(), view_name='matchup-detail')
        matchup = self.init_data['matchup']
        matchup_user = MatchupUser.objects.get(matchup=field.from_native(matchup), user=request.user)
        attrs['matchup_user'] = matchup_user
        attrs.pop('matchup')      
        return MatchupActivity(**attrs)

我想要的是,当显示一系列MatchupActivity时,能够显示matchup字段。

举个例子:

目前的响应是这样的……

{
    "url": "http://localhost:8000/matchup-activities/1/", 
    "question": "http://localhost:8000/questions/1/", 
    "answer": "http://localhost:8000/answers/1/", 
    "points": 1, 
    "time": 1
}

我想要的响应是这样的……

{
    "url": "http://localhost:8000/matchup-activities/1/", 
    "question": "http://localhost:8000/questions/1/", 
    "answer": "http://localhost:8000/answers/1/", 
    "points": 1, 
    "time": 1,
    "matchup":{
        #matchup related fields...
    }
}

1 个回答

1

为MatchupUser模型写一个单独的序列化器,别再用:

matchup = serializers.HyperlinkedRelatedField(queryset=Matchup.objects.all(), view_name='matchup-detail')

而是用:

matchup = MatchupUserSerializer()

按照指示在这里查看

撰写回答