#django #python-3.x #api
#django #python-3.x #API
Вопрос:
Иметь таблицу Users (с идентификатором полей, name) и таблицу Comments (Comment, CreatedBy (целое число) — это идентификатор пользователя).
Как я могу написать сериализатор для извлечения списка пользователей, который должен содержать массив комментариев, созданных каждым пользователем.
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = Users
fields = ('id','name')
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = UserComments
fields = ('id','comment','created_by')
Ожидаемый результат ниже:
[
{
"id":1,
"name":"Tony",
"comments":[
{
"id":1,
"comment":"This is a test comment"
},
{
"id":2,
"comment":"This is a test comment2"
}
]
},
{
"id":2,
"name":"Alaric",
"comments":[
{
"id":3,
"comment":"This is a test comment3"
},
{
"id":4,
"comment":"This is a test comment4"
}
]
}
]
Комментарии:
2. @DanielRoseman проблема в том, что модель не имеет отношения к внешнему ключу.
3. Ну, почему бы и нет? Если CreatedBy — это целое число, представляющее идентификатор пользователя, почему бы не объявить его как внешний ключ?
Ответ №1:
Лучшим способом для этого было бы использование отношения ForeignKey и вложенных сериализаторов, но если по какой-то причине вы не можете объявить отношение foreign key между UserComments и Users, вы можете использовать SerializerMethodFields:
class UserSerializer(serializers.ModelSerializer):
comments = serializers.SerializerMethodField()
class Meta:
model = Users
fields = ('id','name', 'comments')
def get_comments(self, obj):
return CommentSerializer(UserComments.objects.filter(created_by=obj.id), many=True).data
Комментарии:
1. Потрясающе. Спасибо @Ozgur Akcali
2. @MadhuP Я обновил свой ответ, вам также необходимо добавить комментарии к списку полей в мета-классе