Обратный вращающийся ключ в сериализаторах Django

Предположим

class Post(models.Model):
    content = ...
    image = ...
    timestamp = ...

class PostLike(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,...)
    post = models.ForiegnKey(Post,...)
    timestamp = ...

и

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ("content","image","timestamp","liked")

Здесь liked может быть true или false. Оно будет истинным, если пользователь (request.user) находится в PostLike.

Как мне создать это понравившееся поле?

view

@login_required()
def AllPosts(request):
    obj = Posts.objects.all()
    serializer = PostSerializer(obj, many=True)
    result = JsonResponse(serializer.data, safe=False)
    return result

В вашем сериализаторе уже есть поле для атрибута liked, не хватает только поля:

class PostSerializer(serializers.ModelSerializer):
    liked = serializers.BooleanField(read_only=True)
    class Meta:
        model = Post
        fields = ('content', 'image', 'timestamp', 'liked')

Вам нужен QuerySet, где посты имеют дополнительный атрибут .liked Вы можете аннотировать Post объекты дополнительным атрибутом, который указывает, понравился ли объект:

from django.db.models import Exists, OuterRef

def @login_required
def AllPosts(request):
    obj = Posts.objects.get_queryset(*args, **kwargs).annotate(
        liked=Exists(
            PostLike.objects.filter(user=request.user, post_id=OuterRef('pk'))
        )
    )
    serializer = PostSerializer(obj, many=True)
    result = JsonResponse(serializer.data, safe=False)
    return result
Вернуться на верх