Django Rest Framework - Как проверить, находится ли значение в массиве объектов связанных полей?

У меня есть модель поста и у него есть лайки (ответы). Я хочу посмотреть, нравилось ли уже сообщение вошедшему пользователю, и поэтому мне нужно проверить, совпадает ли id вошедшего пользователя с любым из пользователей, которым понравилось сообщение.

Вот модель поста:

class Post(models.Model):
    category = models.ForeignKey(Category, on_delete=models.SET_DEFAULT, default=1, related_name="posts")
    body = models.TextField("content", blank=True, null=True, max_length=5000)
    slug = AutoSlugField(populate_from=["category", "created_at"])
    video = models.FileField(upload_to=video_directory_path, null=True, blank=True)
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="posts"
    )
    published = models.BooleanField(default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "post"
        verbose_name_plural = "posts"
        db_table = "posts"
        ordering = ["created_at"]
        get_latest_by = "created_at"

    def __str__(self):
        return self.body[0:30]

    def get_absolute_url(self):
        return self.slug

    def one_image(self):
        return PostImage.objects.all().filter(post=self)[:1] 

Вот модель Post Response (типа):

class PostResponse(models.Model):
    like = "like"
    feelings = [
        (like , "like"),
    ]
    response = models.CharField(max_length=15,choices=feelings, default=like)
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="responses")
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        unique_together = ['post', 'user']
        verbose_name = "Post response"
        verbose_name_plural = "Post responses"
        db_table = "post_responses"

    def __str__(self):
        return str(self.response)

Вот сериализатор Post Response, и он вроде как работает, потому что есть только один ответ. Как я могу проверить, соответствует ли идентификатор пользователя какому-либо из ответов, например, списку ответов?

class PostResponseSerializer(serializers.ModelSerializer):
    liked = serializers.SerializerMethodField()
    class Meta:
        model = PostResponse
        fields = [
            "post",
            "response",
            "user",
            "liked",
        ]
    def get_liked(self, obj):
        request = self.context.get('request', None)
        if request:
            loggedUser = self.context["request"].user.id
            if loggedUser == obj.user.id:
                return True

У вас уже есть отношения https://docs.djangoproject.com/en/4.1/topics/db/examples/many_to_one/

Для доступа к понравившимся ответам пользователя достаточно обратиться к нему через экземпляр пользователя

user = request.user
liked_responses = user.postresponse_set.all()

Предположим, что у вас уже есть PostResponseViewSet. Вы можете поместить его в ваш набор представлений через метод get_queryset:

class PostResponseViewSet(ModelViewSet):
    # ...other attributes
    def get_queryset(self):
        return self.request.user.postresponse_set.all()

Вы можете получить доступ к примеру через экземпляр поста через обратную связь, используя related_name

class PostResponseSerializer(serializers.ModelSerializer):
    liked = serializers.SerializerMethodField()
    class Meta:
        model = PostResponse
        fields = [
            "post",
            "response",
            "user",
            "liked",
        ]
    def get_liked(self, obj):
        request = self.context.get('request', None)
        if request:
            loggedUser = self.context["request"].user
            is_liked = obj.responses.filter(user=loggedUser).exists()
            return is_liked
Вернуться на верх