Как вернуть ID автора сообщения и имя пользователя вместо просто ID в DjangoREST - PullRequest
1 голос
/ 21 сентября 2019

Когда я делаю GET-запрос к моим / api / posts /, я получаю только идентификатор автора, но я также хочу, чтобы имя пользователя автора отображало его.Как мне это сделать?

Я хочу, чтобы ответ был примерно таким:

[
  {
     // all other stuff
     author: {
       id: 1,
       username: "foo"
     }
  }
]

Это мой пост Viewset:

class PostViewSet(viewsets.ModelViewSet):
    """Handle CRUD for Posts"""
    serializer_class = serializers.PostSerializer
    authentication_classes = (TokenAuthentication,)
    queryset = Post.objects.all()

    def perform_create(self, serializer):
        """Set author to current user"""
        serializer.save(user=self.request.user)

И это то, что яполучите в ответ:

[
    {
        "id": 1,
        "title": "Welcome!",
        "description": "Welcome test!",
        "created_at": "2019-09-21T01:05:58.170330Z",
        "author": 1,
        "community": 2
    }
]

Я хочу сделать то же самое для сообщества, но я думаю, что я выясню это из решения автора.

Ответы [ 2 ]

2 голосов
/ 21 сентября 2019

Использование Вложенный сериализатор ,


<b>class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('id', 'username')
        model = AuthorModel</b>


class PostSerializer(...):
    <b>author = AuthorSerializer()</b>
    # other things

ОБНОВЛЕНИЕ

В таких случаях мы должны переопределить метод to_representation.Я уже ответил здесь, DRF: Простое назначение внешнего ключа с вложенными сериализаторами?

<b>class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('id', 'username')
        model = AuthorModel</b>


class PostSerializer(...):
    # author = AuthorSerializer() <b># no need of this here</b>
    # other things
    <b>def to_representation(self, instance):
        representation = super().to_representation(instance)
        representation["author"] = AuthorSerializer(instance.author).data
        return representation</b>
1 голос
/ 21 сентября 2019

Вы можете переопределить метод сериализатора to_representation():

class PostSerializer:
    """ Your code here"""

    def to_representation(self, instance):
        ret = super().to_representation(instance)
        ret['author'] = {"id": instance.author.id, "username": instance.author.username}
        return ret
...