Обратный вращающийся ключ в сериализаторах 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