2017-03-23 10 views
0

私は基本的な質問回答アプリを実装しようとしています。ここに私の質問のモデルは次のとおりです。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_name='question_user', null=True, default=None, on_delete=models.CASCADE) 
     upvote_by = models.ManyToManyField(User, default=None, related_name='advicesv1_upvote_question') 

、私の代わりに、デフォルトで送信されたIDの「asked_by」と「upvote_by」の人々のユーザ名/ first_namesを送りたいです。これを実装するために私はこのようなネストされたシリアライザ使用:

{ 
     "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 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": "testuser141", 
    "upvote_by": ["testuser", "testuser1",....], 
    }, 

何django restframeworkシリアライザを使ってこれを達成する最善の方法は?

答えて

1

あなたはto_representationメソッドをオーバーライドすることができますあなたのQuesUserSerializerがオブジェクトではなく、各ユーザの文字列を返すようにネストされたシリアライザの

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

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

どうもありがとう!! .....それは働きました! –

1

このように、表現方法に上書きしよう:

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 

これが唯一の更新O保存のロジックオブジェクトの表現をchangueではなく...

+0

感謝をたくさん!!使用することです... –