Как найти друзей друзей (общих друзей) - Django
Мне удалось получить список всех пользователей, а также реализовать отправленный запрос на добавление в друзья (following/подписчик). Итак, как мне найти общих друзей (following/подписчики)? Например, если у обоих пользователей есть общий друг.
Приведенный ниже код - это то, что я пробовал, но общие друзья не отображаются. Что я делаю не так и как я могу сделать это правильно?
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,blank=True,null=True)
profile_pic = models.ImageField(upload_to='UploadedProfilePicture/', default="ProfileAvatar/avatar.png", blank=True)
following = models.ManyToManyField(
'Profile', # Refers to the User model itself
symmetrical=False, # If A follows B, B doesn't automatically follow A
related_name='followers', # Reverse relationship: get followers of a user
blank=True,
)
def FollowingView(request):
page_title = "Following"
# All users following posts
posts = Post.objects.filter(
Q(poster_profile=request.user)|
Q(poster_profile__profile__followers__user=request.user)).order_by("?").distinct()
# All account users
profile_users = Profile.objects.exclude(
Q(user=request.user))
# Mutual Followers
all_following = request.user.profile.following.values_list('pk', flat=True)
mutual_followers = Profile.objects.filter(pk__in=all_following)
Вы можете получить подписчиков подписчиков пользователя с помощью:
friends_of_friends = Profile.objects.filter(followers__followers__user=request.user)
или для общих друзей между request.user и пользователем C:
friends_of_friends = Profile.objects.filter(
followers__user=request.user
).filter(
followers__user=C
)
Если вы хотите сделать это для всех Profile -ов, вы можете работать с Prefetch объектом:
my_profiles = Profile.objects.prefetch_related(
Prefetch(
'following',
Profile.objects.filter(followers__user=request.user),
to_attr='friends_in_common'
),
)
У Profile в my_profiles будет дополнительный атрибут .friends_in_common с набором Profile, общих с request.user.
Мне удалось заархивировать получение общих друзей по запросу.друзья пользователя, которые являются друзьями других пользователей, которые не являются друзьями по запросу.пользователь.... Используя ManyToManyField (следующее)
в Views.py/Template
# Mutual Friends
all_following = request.user.profile.following.values_list('pk', flat=True)
mutual_followers = Profile.objects.filter(pk__in=all_following)
# Template
{% for users in profile_users %}
# List of users
<p>{% users.user %}</p>
# Get mutual friend for each users that is friend to request.user
{% for mutual_friend in mutual_followers %}
{% if mutual_friend in users.following.all %}
<p>{{ mutual_friend.user.username }}</p>
{% endif %}
{% endfor %}
{% endfor %}