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