Как показать в сериализаторе типа существует или нет на основе request.data в django

у меня есть модель post и модель like с ForeignKey. в API пользователь дает идентификатор сессии пользователя. я хочу показать пользователю понравился пост или нет на основе идентификатора сессии, когда я перечисляю все посты. например. когда мы открываем instagram мы можем как пользователь, какой пост нам понравился или нет в значке сердечка .

models.py

class Post(models.Model):
  title = models.CharField(max_length=150)
  image = models.FileField( upload_to="post/",)

class PostLike(models.Model):
    like = models.CharField(max_length=10)
    user = models.ForeignKey(Customer,on_delete=models.CASCADE,related_name='post_likes')
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='likes')

views.py

@api_view(["POST"])
def post(request):
  if request.data != {}:
     session_id = request.data["session_id"]
     user = Customer.objects.filter(session_id=session_id)
         if user.count() != 0:
             posts = Post.objects.all()
             like_exist = PostLike.objects.filter(user = user).exists()
             serializer = PostSerializer(posts, many=True,context= 
                           {"like_exist":like_exist)
             return Custom_Response(request, news_serializer.data)

serializer.py

class PostSerializer(serializers.ModelSerializer):
    like_exist = serializers.SerializerMethodField("like_exist_")

    class Meta:
        model = News
        fields  = ["title","image","like_exist"]

    def like_exist_(self,obj):
        is_liked = self.context.get("like_exist")
        return is_liked

db

post

id title image
1  1st    ""
2  2nd    ""

post_like

id like post_id user_id 
1   1   1       1
2   1   2       1
3   1   1       2

если api вводит session_id 10000, то это клиент 1 поэтому я хочу показать вот так

API

"data": [
        {
            "id": 1,
            "title": "trend post 1",
            "like_exist":true ,
        },
        {
            "id": 2,
            "title": "trend post 2",
            "like_exist": true,
        }
    ]

если это 20000, то это клиент 2 поэтому ответ должен выглядеть как

"data": [
        {
            "id": 1,
            "title": "trend post 1",
            "like_exist":true ,
        },
        {
            "id": 2,
            "title": "trend post 2",
            "like_exist": false,
        }
    ]

как это получить? Я думаю, что это может быть работа со свойством модели. но как? ???

извините за мой плохой английский, Спасибо

Если я правильно вас понял, вам нужно что-то вроде этого

from django.db.models import Count, Exists

@api_view(["POST"])
def post(request):
  if request.data != {}:
     session_id = request.data["session_id"]
     user = Customer.objects.filter(session_id=session_id)
     if user.count() != 0:
         posts = Post.objects.all().annotate(likes=Count('postlike'), i_liked=Exists(PostLike.objects.filter(user=user)))
         serializer = PostSerializer(posts, many=True)
         return Response(request, serializer.data)

И в вашем serializers.py

class PostSerializer(ModelSerializer):
    # Annotated fields
    likes = IntegerField()
    i_liked = BooleanField()

    class Meta:
        model = Post
        fields = ['id', 'title', 'likes', 'i_liked']
Вернуться на верх