2017-02-09 2 views
2

Как можно добавить сериализатор в другой сериализатор? Вот что я имею в виду:Django: добавление двух сериализаторов вместе?

У меня есть модель UserProfile как таковой:

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    photo = models.URLField(max_length=128) 

У меня есть сообщения, которые от пользователя:

class Posts(models.Model): 
    # ... post fields 

Я хочу сериализации мой UserProfile с пользователем и фото, а также сообщения от этого пользователя. Вот результат я и добиваюсь:

{ "user": <User fields serialized>, 
    "photo": "www.example.com/path/to/file", 
    "posts": "[{"from_user": "me", "message": "post message} , 
      {"from_user": "me", "message": "post message2"}, ... etc]," 
} 

В моем views.py я первый собирать сообщения, которые приходят от этого пользователя:

user = User.objects.get(pk=1) 
user_profile = UserProfile.objects.get(user=user) 
user_profile_serializer = UserProfileSerializer(user_profile) 

posts = Posts.objects.get_posts_from_user(user) 
post_serializer = PostsSerializer(posts, many=True) 
# somehow append my post_serializer into my user_profile_serializer? 

Вот мой PostsSerializer.py:

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

Вот мой UserSerializer.py:

class UserProfileSerializer(serializers.ModelSerializer): 
    # somehow filter the results depending on User 
    posts_serializer = PostsSerializer(many=True) 
    class Meta: 
     model = UserProfile 
     fields = ('__all__') 

Я пробовал сериализацию профиля пользователя, и поскольку я добавил переменную сериализатора внутри своего UserProfileSerializer, я предположил, что он автоматически добавит поле posts. Он просто показывает селектор User Profiler, игнорируя сообщения вообще.

ответ

2

Попробуйте использовать SerializerMethodField, чтобы получить сообщения от PostsSerializer и вручную добавить их в поле "posts" к вашему выходу UserProfileSerializer, например.

class UserProfileSerializer 
    ... 
    posts = serializers.SerializerMethodField() 

    class Meta: 
     fields = ("posts", ... other fields, ...} 

    def get_posts(self, user): 
     posts = Posts.objects.get_posts_from_user(user) 
     return PostsSerializer(posts, many=True, context=self.context).data 
+0

Я просто назову 'get_posts' из своих представлений? –

+1

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

+0

, не могли бы вы помочь мне решить этот вопрос, пожалуйста? Это связано с этим вопросом. http://stackoverflow.com/questions/42150996/django-nest-the-object-im-serializing-into-the-serializer –

Смежные вопросы