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