R
R
reqww2020-08-25 19:06:42
Django
reqww, 2020-08-25 19:06:42

How to write an abstract?

There is a friend request model:

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 = 'Запросы на добавление'


There is a contact model:
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 = 'Контакты'


When a user enters another user's page, I want to display the is_sent field, which will indicate whether the request was sent by the current user to the user whose page he visited

. I tried to write something like this, but is_sent does not work:
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


How to output correctly?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
J
JRazor, 2020-08-25
@reqww

It feels like something like this:

Contact.objects.annotate(
  is_sent=Exists(Subquery(
    AddRequest.objects
    .filter(sender_id=self.request.user.id, receiver_id=OutRef('id'))
  ))
)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question