@reqww

Как правильно написать аннотацию?

Есть модель запроса на добавление в друзья:
class AddRequest(models.Model):
    sender = models.ForeignKey(Contact, on_delete=models.CASCADE, related_name = 'invited', null=True)
    receiver = models.ForeignKey(Contact, on_delete=models.CASCADE, null=True, related_name='invites')
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'{self.sender.user.username} -> {self.receiver.user.username}'

    class Meta:
        verbose_name = 'Запрос на добавление'
        verbose_name_plural = 'Запросы на добавление'


Есть модель контакта:
class Contact(models.Model):
    user = models.ForeignKey(User, related_name='friends', on_delete=models.CASCADE)
    friends = models.ManyToManyField('self', blank=True)
    image = models.ImageField('Изображение', upload_to = 'user_avatars/%Y/%m/%d', blank=True)

    def __str__(self):
        return self.user.username

    class Meta:
        verbose_name = 'Контакт'
        verbose_name_plural = 'Контакты'


Хочу при заходе пользователя на страницу другого пользователя выводить поле is_sent, которое будет означать, был ли отправлен запрос текущим пользователем пользователю, на чью страницу он зашел

Пытался написать что-то такое, но is_sent не работает:
class ContactCustomViewSet(RetrieveUpdateDestroyPermissionViewset):
    '''Обзор, обновление и удаление контакта'''
    serializer_class = ContactDetailSerializer
    permission_classes = [IsCurrentUser, ]
    permission_classes_by_action = {
        'retrieve': [permissions.IsAuthenticated, ]
    }

    def get_queryset(self):
        queryset = Contact.objects.all().annotate(
            is_friend=Count('friends', filter=Q(friends__user=self.request.user))
        ).annotate(
            num_friends=Count('friends')
        ).annotate(
            current_user=Count('user', filter=Q(user=self.request.user))
        ).annotate(
            is_sent=Count('invited', filter=Q(invited__user=self.request.user))
        )
        return queryset


Как правильно вывести?
  • Вопрос задан
  • 281 просмотр
Решения вопроса 1
JRazor
@JRazor
Senior StarkOverFlow Programmer
По ощущениям, что-то такое:

Contact.objects.annotate(
  is_sent=Exists(Subquery(
    AddRequest.objects
    .filter(sender_id=self.request.user.id, receiver_id=OutRef('id'))
  ))
)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы