2017-02-10 7 views
0

Я ищу гнездо объекта, который я сериализую. Вот что я имею в виду:Django: гнездо объекта, который я сериализую в сериализаторе?

Мой текущий UserSerializer:

class UserSerializer(serializers.ModelSerializer): 
    posts = serializers.SerializerMethodField() 
    class Meta: 
     model = User 
     fields = ('__all__') 
    def get_posts(self, user): 
     posts = Posts.objects.get_posts_for_user(user=user) 
     return PostsSerializer(posts, many=True, context=self.context) 

Вот мой PostsSerializer:

class PostsSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Posts 
     fields = ('__all__') 

Вот что, как это сериализовано:

{ "name": "Bobby Busche", 
    "email": "[email protected]", 
    "posts": [ {"from_user": "me", "message": "Hello World"}, 
      {"from_user": "me", "message": "Bye bye"} ], 
    "username": "ilovemymomma" 
} 

Но я хочу, чтобы пользователь для группировки внутри ключа «пользователь» следующим образом:

{ "user": { "name": "Bobby Busche", 
      "email": "[email protected]", 
      "username": "ilovemymomma" } 
    "posts": [ {"from_user": "me", "message": "Hello World"}, 
      {"from_user": "me", "message": "Bye bye"} ] 

} 

Мне нужно немного ориентироваться в том, что лучше всего подходит для этого.

+1

Пользовательский сериализатор - это путь! Быстрая и чистая. –

ответ

2

Вы можете сделать собственный сериализатор, как указал Раджес. Обратите внимание, что этот сериализатор доступен только для чтения.

class UserPostsSerializer(serializers.BaseSerializer): 

    def to_representation(self, instance): 
     posts = Posts.objects.get_posts_for_user(user=instance) 
     return { 
      'user': UserSerializer(instance).data, 
      'posts': PostSerialzer(posts, many=True).data 
     } 

Затем нужно будет удалить поле сообщений от UserSerializer, так что посты не вложены в этот один тоже.