Как показать следующее количество в шаблоне 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 следующий.
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()




