Django Rest Framework - 获取列表中的完整相关对象

ZvL*_*ZvL 5 python django rest django-rest-framework

我是Django Rest Framework的新手,我正在尝试使用DRF序列化(相关)对象列表.

我有以下型号:

class Answer(models.Model):
   value = models.CharField(max_length=128)

class User(models.Model):
   name = models.CharField(max_length=128)
   age = models.PositiveIntegerField()

class UserAnswer(models.Model):
    user = models.ForeignKey(User)
    answer = models.ForeignKey(Answer)
Run Code Online (Sandbox Code Playgroud)

我试图获得的结果是这种形式:

[
    {
     "name": "myName1",
     "answers": [
        {
          "value": "myFirstAnswer"
        },
        {
          "value": "mySecondAnswer"
        },
        {
          "value": "myThirdAnswer"
        },
        ]
    },
    {
     "name": "myName2",
     "answers": [
        {
          "value": "myFirstAnswer"
        },
        {
          "value": "mySecondAnswer"
        },
        {
          "value": "myThirdAnswer"
        },
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

我现在正试着这样做:

class UserAnswerSerializer(serializers.ModelSerializer):
    answers = AllUserAnswersSerializer(many=True, read_only=True)
    class Meta:
        model = User
        fields = ('name', 'answers')
Run Code Online (Sandbox Code Playgroud)

但后来我得到以下结果:

[
    {
        "name": "myName1"
    }, 
    {
        "name": "myName2"
    }
]
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时:

class UserAnswerSerializer(serializers.ModelSerializer):
    answers = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    class Meta:
        model = User
        fields = ('name', 'answers')
Run Code Online (Sandbox Code Playgroud)

然后我得到以下结果(再次举例):

[
    {
     "name": "myName1",
     "answers": [
        1,
        2,
        3
        ]
    },
    {
     "name": "myName2",
     "answers": [
        4,
        5,
        6
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

我正在努力完成这项工作,希望有人能告诉我如何将主键转换为实际对象!

谢谢!

arg*_*aen 8

删除序列化程序中的答案字段的显式定义并添加depth=1.它应该如下所示:

class UserAnswerSerializer(serializers.ModelSerializer):
    class Meta:
        depth = 1
        model = User
        fields = ('name', 'answers')
Run Code Online (Sandbox Code Playgroud)

有关深度的信息:http://www.django-rest-framework.org/api-guide/serializers/#specifying-nested-serialization