Как показать в сериализаторе типа существует или нет на основе 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']