Python Django Rest框架:嵌套序列化程序返回字典,但需要列表

Python Django Rest框架:嵌套序列化程序返回字典,但需要列表,python,django,nested,django-rest-framework,Python,Django,Nested,Django Rest Framework,我正在尝试实现一个基本的问答应用程序。以下是我的问题模型: class Questions(models.Model): created = models.DateTimeField(auto_now_add=True) question = models.CharField(max_length=1000, blank=True, default='') asked_by = models.ForeignKey(User, related_na

我正在尝试实现一个基本的问答应用程序。以下是我的问题模型:

    class Questions(models.Model):
       created = models.DateTimeField(auto_now_add=True)
       question = models.CharField(max_length=1000, blank=True, default='')
       asked_by = models.ForeignKey(User, related_name='question_user', null=True, default=None, on_delete=models.CASCADE)
       upvote_by = models.ManyToManyField(User, default=None, related_name='advicesv1_upvote_question')
现在,我想发送“Ask_by”和“upvote_by”中的用户名/名字,而不是默认发送的ID。为了实现这一点,我使用了如下嵌套序列化程序:

    class QuesUserSerializer(serializers.ModelSerializer):
       class Meta:
         model = User
         fields = ('username',)

    class NewQuestionSerializer(serializers.ModelSerializer):
      question_id = serializers.IntegerField(source='id', required=False)
      asked_by = QuesUserSerializer(read_only=True)
      upvote_by = QuesUserSerializer(many=True, read_only=True)

      class Meta:
       model = Questions
       fields = ('question_id', 'created', 'question', 'asked_by', 'upvote_by',)
    {
      "question_id": 182,
      "created": "2017-03-07T10:53:16.241533Z",
      "question": "hey what's up?",
      "asked_by": {
        "username": "testuser141"
      },
      "upvote_by": [
       {
         "username": "testuser"
       },
       {
         "username": "testuser1"
       }
  ]
},
class NewQuestionSerializer(serializers.ModelSerializer):
    question_id = serializers.IntegerField(source='id', required=False)
    asked_by = QuesUserSerializer(read_only=True)
    upvote_by = QuesUserSerializer(many=True, read_only=True)

    class Meta:
        model = Questions
        fields = ('question_id', 'created', 'question', 'asked_by', 'upvote_by',)
    def to_representation(self, obj):
        data = super(NewQuestionSerializer, self).to_representation(obj)
        data['asked_by']= obj.asked_by.username
        data['upvoted_by'] = obj.upvote_by.all().values_list('username', flat=True)
        return data 
因此,我目前的回答是:

    class QuesUserSerializer(serializers.ModelSerializer):
       class Meta:
         model = User
         fields = ('username',)

    class NewQuestionSerializer(serializers.ModelSerializer):
      question_id = serializers.IntegerField(source='id', required=False)
      asked_by = QuesUserSerializer(read_only=True)
      upvote_by = QuesUserSerializer(many=True, read_only=True)

      class Meta:
       model = Questions
       fields = ('question_id', 'created', 'question', 'asked_by', 'upvote_by',)
    {
      "question_id": 182,
      "created": "2017-03-07T10:53:16.241533Z",
      "question": "hey what's up?",
      "asked_by": {
        "username": "testuser141"
      },
      "upvote_by": [
       {
         "username": "testuser"
       },
       {
         "username": "testuser1"
       }
  ]
},
class NewQuestionSerializer(serializers.ModelSerializer):
    question_id = serializers.IntegerField(source='id', required=False)
    asked_by = QuesUserSerializer(read_only=True)
    upvote_by = QuesUserSerializer(many=True, read_only=True)

    class Meta:
        model = Questions
        fields = ('question_id', 'created', 'question', 'asked_by', 'upvote_by',)
    def to_representation(self, obj):
        data = super(NewQuestionSerializer, self).to_representation(obj)
        data['asked_by']= obj.asked_by.username
        data['upvoted_by'] = obj.upvote_by.all().values_list('username', flat=True)
        return data 
但我希望得到的答复是:

    {
     "question_id": 182,
     "created": "2017-03-07T10:53:16.241533Z",
     "question": "hey what's up?",
     "asked_by": "testuser141",
     "upvote_by": ["testuser", "testuser1",....],
    },

使用django restframework序列化程序实现此目的的最佳方法是什么?

尝试覆盖到表示方法,如下所示:

    class QuesUserSerializer(serializers.ModelSerializer):
       class Meta:
         model = User
         fields = ('username',)

    class NewQuestionSerializer(serializers.ModelSerializer):
      question_id = serializers.IntegerField(source='id', required=False)
      asked_by = QuesUserSerializer(read_only=True)
      upvote_by = QuesUserSerializer(many=True, read_only=True)

      class Meta:
       model = Questions
       fields = ('question_id', 'created', 'question', 'asked_by', 'upvote_by',)
    {
      "question_id": 182,
      "created": "2017-03-07T10:53:16.241533Z",
      "question": "hey what's up?",
      "asked_by": {
        "username": "testuser141"
      },
      "upvote_by": [
       {
         "username": "testuser"
       },
       {
         "username": "testuser1"
       }
  ]
},
class NewQuestionSerializer(serializers.ModelSerializer):
    question_id = serializers.IntegerField(source='id', required=False)
    asked_by = QuesUserSerializer(read_only=True)
    upvote_by = QuesUserSerializer(many=True, read_only=True)

    class Meta:
        model = Questions
        fields = ('question_id', 'created', 'question', 'asked_by', 'upvote_by',)
    def to_representation(self, obj):
        data = super(NewQuestionSerializer, self).to_representation(obj)
        data['asked_by']= obj.asked_by.username
        data['upvoted_by'] = obj.upvote_by.all().values_list('username', flat=True)
        return data 

这只是改变了对象的表示,而不是保存到更新的逻辑…

尝试覆盖到表示方法,如下所示:

    class QuesUserSerializer(serializers.ModelSerializer):
       class Meta:
         model = User
         fields = ('username',)

    class NewQuestionSerializer(serializers.ModelSerializer):
      question_id = serializers.IntegerField(source='id', required=False)
      asked_by = QuesUserSerializer(read_only=True)
      upvote_by = QuesUserSerializer(many=True, read_only=True)

      class Meta:
       model = Questions
       fields = ('question_id', 'created', 'question', 'asked_by', 'upvote_by',)
    {
      "question_id": 182,
      "created": "2017-03-07T10:53:16.241533Z",
      "question": "hey what's up?",
      "asked_by": {
        "username": "testuser141"
      },
      "upvote_by": [
       {
         "username": "testuser"
       },
       {
         "username": "testuser1"
       }
  ]
},
class NewQuestionSerializer(serializers.ModelSerializer):
    question_id = serializers.IntegerField(source='id', required=False)
    asked_by = QuesUserSerializer(read_only=True)
    upvote_by = QuesUserSerializer(many=True, read_only=True)

    class Meta:
        model = Questions
        fields = ('question_id', 'created', 'question', 'asked_by', 'upvote_by',)
    def to_representation(self, obj):
        data = super(NewQuestionSerializer, self).to_representation(obj)
        data['asked_by']= obj.asked_by.username
        data['upvoted_by'] = obj.upvote_by.all().values_list('username', flat=True)
        return data 

这只会改变对象的表示,而不会改变保存到更新的逻辑…

您可以覆盖嵌套序列化程序的
to_表示方法,以便
quesuserializer
为每个用户返回一个字符串,而不是一个对象

class QuesUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

    def to_representation(self, obj):
        return obj.username

您可以重写嵌套序列化程序的
to_表示法
方法,以便
QuesUserSerializer
为每个用户返回一个字符串,而不是一个对象

class QuesUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

    def to_representation(self, obj):
        return obj.username
虽然答案可行,但更优雅的解决方案是使用a

虽然答案可行,但更优雅的解决方案是使用a