2017-02-09 5 views
2

Wie ist es möglich, einen Serializer innerhalb eines anderen Serialisierers hinzuzufügen? Hier ist, was ich meine:Django: Hinzufügen von zwei Serialisierern zusammen?

ich ein Userprofile Modell als solche haben:

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

ich Beiträge haben, die von dem Benutzer sind:

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

Ich möchte meine Userprofile mit dem Benutzer zur Serialisierung und Foto, sowie die Beiträge von diesem Benutzer. Hier ist das Ergebnis, das ich bin mit dem Ziel für:

{ "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]," 
} 

In meinem views.py ich zuerst die Beiträge sammeln, die von diesem Benutzer kommen:

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? 

Hier ist meine PostsSerializer.py:

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

ist mein UserSerializer.py:

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

Ich habe versucht, das Benutzerprofil zu serialisieren, und weil ich eine Serializer-Variable in meinem UserProfileSerializer hinzugefügt habe, nahm ich an, dass es automatisch das Feld posts hinzufügen würde. Es zeigt nur den User Profiler serialisiert und ignoriert die Beiträge insgesamt.

Antwort

2

Versuchen Sie eine SerializerMethodField zu verwenden, um die Beiträge von PostsSerializer zu erhalten, und fügen Sie sie manuell in einem Feld "Posts" zu Ihrer UserProfileSerializer-Ausgabe hinzu, z.

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

Kann ich 'get_posts' einfach aus meinen Ansichten aufrufen? –

+1

Nein, Sie würden einfach Ihren Benutzer serialisieren, und es würde die Beiträge automatisch anhängen –

+0

Würden Sie mir bitte mit dieser Frage helfen? Es hängt mit dieser Frage zusammen. http://stackoverflow.com/questions/42150996/django-nest-the-object-im-serializing-into-the-serializer –