Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to return list of ID-s with Django Rest framework serializer?

With this type of serializer, I got as an ID value inside the post object of the id of the user that made the post but I want a list of users that liked the post. Following Django documentation, I think that it should look like this but apparently, something is wrong.

User = get_user_model()

class StudentSerializer(serializers.ModelSerializer):
    class Meta(UserCreateSerializer):
        model = User
        fields = ['id', 'name', 'email' ]


class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProjectPost
        fields = ['id',
                ...
                'published',]


class LikeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Like
        fields = ['id']

class PostSerializer(serializers.ModelSerializer):
    student = serializers.SerializerMethodField()
    project = serializers.SerializerMethodField()
    likes = serializers.SerializerMethodField()

    class Meta:
        model = Post
        fields = ['id', 'student', 'project', 'likes']
        
    def get_like(self, obj):
        return LikeSerializer(obj).data
    
    def get_student(self, obj):
        return StudentSerializer(obj.student).data

    def get_project(self, obj):
        return ProjectSerializer(obj.project).data

And here are my Models

User = get_user_model()

class Post(models.Model):
    student = models.ForeignKey(User, on_delete=models.CASCADE, default=None, null=True, blank=True, related_name="student")
    project = models.OneToOneField(ProjectPost, on_delete=models.CASCADE, default=None, null=True, blank=True)
    #bookmark = models.ManyToManyField(User, blank=True, related_name='bookmark')

    def get_student(self):
        return self.student.name


class Like(models.Model):
    user = models.ForeignKey(User,unique=True, on_delete=models.CASCADE, default=None, null=True, blank=True)
    post = models.ForeignKey(Post, on_delete=models.CASCADE, default=None, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def get_user(self):
        print(self.user.id, 'aaa')
        return self.user.id
like image 351
Nikola Avatar asked Oct 19 '25 13:10

Nikola


2 Answers

To get a list of user IDs that liked a post, in PostSerializer you could use another SerializerMethodField like this:

class PostSerializer(serializers.ModelSerializer):
    users_liked = serializers.SerializerMethodField()
    

def get_users_liked(self, obj):
    return obj.like_set.all().values_list("user__id", flat=True) 
like image 173
Igor Moraru Avatar answered Oct 22 '25 04:10

Igor Moraru


You're looking for serializers.PrimaryKeyRelatedField.

As per the docs:

PrimaryKeyRelatedField may be used to represent the target of the relationship using its primary key.

For example, the following serializer:

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ['album_name', 'artist', 'tracks']

Would serialize to a representation like this:

{
    'album_name': 'Undun',
    'artist': 'The Roots',
    'tracks': [
        89,
        90,
        91,
        ...
    ]
}
like image 23
schillingt Avatar answered Oct 22 '25 03:10

schillingt



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!