Получить список пользователей и сделанные ими комментарии (сериализаторы Django)

#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"
             }
          ]
       }
    ]
  

Комментарии:

1. Вложенные отношения

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 Я обновил свой ответ, вам также необходимо добавить комментарии к списку полей в мета-классе