Question

I have two models:

class User(models.Model):
  username = models.CharField()

and

class Post(models.Model):
  text = models.TextField()
  owner = models.ForeignKey(User)

Using such serializer:

from rest_framework.serializers import ModelSerializer

class PostSerializer(ModelSerializer):
    owner = serializers.Field(source='owner.id')

    class Meta:
        model = Post
        fields = ['text', 'owner']

I get all posts with owners' ids. How can I modify serializer to get all posts with owner fialed containing the whole user model?

I tryied from rest_framework.serializers import ModelSerializer

class PostSerializer(ModelSerializer):
    owner = serializers.Field(source='owner')

    class Meta:
        model = Post
        fields = ['text', 'owner']

but that only replaced id with username, not the whole model as I expected(because User's representation returns username field).

Was it helpful?

Solution

The solution is to define UserSerializer extending ModelSerializer like that

from rest_framework.serializers import ModelSerializer

class UserSerializer(ModelSerializer):

    class Meta:
        model = UserModel
        fields = ['id', 'username']

and then use it in PostSerializer:

from myapp import UserSerializer
from rest_framework.serializers import ModelSerializer

class PostSerializer(ModelSerializer):
    owner = UserSerializer()

    class Meta:
        model = PostModel
        fields = ['id', 'owner']

OTHER TIPS

Use the depth option within your ModelSerializer's Meta class:

class PostSerializer(ModelSerializer):

    class Meta:
        model = Post
        fields = ['text', 'owner']
        depth = 1

Also note that you don't need to include the Author field.

Docs here.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top