Как показать следующее количество в шаблоне django

Мне удалось получить количество подписчиков / следующих пользователей, но когда пользователь A подписывается на пользователя B, пользователь B принимает запрос пользователя A на подписку (они находятся в списке друзей). После принятия запроса я хочу отобразить количество (1) для списка подписчиков пользователя A и списка подписчиков пользователя B... Таким образом, это выглядит следующим образом: пользователь A подписчик (1), следующий за (1).... Для пользователя B подписчик (1), следующий за (1). Точно так же, как на прикрепленном изображении к моему вопросу.....

Например, как в Instagram: если пользователь A отправляет запрос на подписку пользователю B, в профиле пользователя A отображается 1 подписчик, 0 подписчиков, а в профиле пользователя B отображается 1 подписчик, 0 подписчиков.. Когда пользователь B принимает запрос пользователя A в друзья, в профиле пользователя A отображается 1 подписчик, 1 следующий... пользователь B 1 подписчик, 1 следующий.

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,blank=True,null=True) 
    friends = models.ManyToManyField('Profile', related_name="my_friends", blank=True)


class FriendRequest(models.Model):
    from_user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, related_name='from_user')
    to_user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, related_name='to_user')


def ProfileView(request, username):
    #Follow requests
    my_friend_ids = set(
    request.user.profile.friends.values_list('user', flat=True)
    )
    my_pending_friend_requests = set(FriendRequest.objects.filter(from_user=request.user).values_list('to_user_id', flat=True))
    my_reverse_friend_requests = set(FriendRequest.objects.filter(to_user=request.user).values_list('from_user_id', flat=True))

    user = request.user
    friends_received = FriendRequest.objects.filter(to_user=user)
    # Option 2: Get users that have sent friend requests to the current user
    friends_sent = FriendRequest.objects.filter(from_user=user)


#Template
{% for post in posts %}
<div>{{ post.poster_profile }}</div>
{% if post.poster_profile_id in my_friend_ids %}
    <button>Unfriend</button>
{% elif post.poster_profile_id in my_pending_friend_requests %}
    <button>Pending</button>
{% elif post.poster_profile_id in my_reverse_friend_requests %}
    <button>Accept</button>
{% else %}
    <button>Send Friend Request</button>
{% endif %}

<div>{{ post.caption }}</div>
{% endfor %}


#Follower/Following count
<p><b>{{ friends_sent|length|humanize_number }}</b> Following</p>
<p><b>{{ friends_received|length|humanize_number }}</b> Followers</p>

Я думаю, вы пропустили поля в вашем value_list. Вы сделали следующее to_user_id и from_user_id

my_pending_friend_requests = set(FriendRequest.objects.filter(from_user=request.user).values_list('to_user_id', flat=True))
my_reverse_friend_requests = set(FriendRequest.objects.filter(to_user=request.user).values_list('from_user_id', flat=True))

вместо to_user и from_user . Кроме того, вам не нужно указывать SET в вашем запросе; это увеличит время вычислений, и вы можете вызвать distinct, который выполняет уникальный вызов в базе данных.

Кроме того, используйте count для получения подписчиков и фолловеров, а не извлекайте все данные целиком и используйте шаблон django для подсчета.
Смотрите полную рекомендацию ниже:

my_friend_ids = request.user.profile.friends.values_list('user', flat=True).distinct()
     

my_pending_friend_requests = FriendRequest.objects.filter(from_user=request.user).values_list('to_user', flat=True).distinct()

my_reverse_friend_requests = FriendRequest.objects.filter(to_user=request.user).values_list('from_user', flat=True).distinct()


user = request.user
friends_received_count = FriendRequest.objects.filter(to_user=user).count()
    # Option 2: Get users that have sent friend requests to the current user
friends_sent_count = FriendRequest.objects.filter(from_user=user).count()
Вернуться на верх