Итак, я не был полностью уверен, чего вы пытались достичь здесь. Это был случай, когда нужно было найти всех не-друзей для конкретного пользователя или иметь конкретного пользователя и попытаться найти всех его друзей, которые не были друзьями друг с другом. Я решил, что сделаю и то, и другое, и позволю тебе решить, какой ты хочешь.
Во-первых, есть две функции. Одна из них - основная функция, которую мы будем использовать, другая - просто для отображения информации.
def get_non_friends_for_user(u, friend_ids_filter=[]):
# Search the friends lists
friend_ids = list(CustomUserFriends.objects.filter(
from_customuser_id=u.pk).values_list('to_customuser_id', flat=True))
friend_ids += list(CustomUserFriends.objects.filter(
to_customuser_id=u.pk).values_list('from_customuser_id', flat=True))
# Search the requests lists
friend_ids += list(FriendRequests.objects.filter(
requester=u.pk).values_list('requestee', flat=True))
friend_ids += list(FriendRequests.objects.filter(
requestee=u.pk).values_list('requester', flat=True))
non_friends = CustomUser.objects.exclude(id__in=friend_ids)
if friend_ids_filter:
non_friends = non_friends.filter(id__in=friend_ids_filter)
return non_friends
def display_user_info(cu, non_friends):
print
print cuf.name
for non_friend in non_friends:
print '\t', non_friend.name
Теперь, чтобы получить всех людей, которые не являются друзьями определенного пользователя, мы просто используем эту функцию
# Get all non-friends for custom_user
# Note that custom_user should be defined before as a CustomUsers object
non_friends = get_non_friends_for_user(custom_user)
display_user_info(custom_user, non_friends)
Чтобы получить список друзей пользователя, которые не дружат с другими его друзьями, мы можем сделать следующее:
# Again, custom_user must already be defined as a CustomUsers object
custom_user_non_friends = {}
custom_user_friends = CustomUserFriends.objects.filter(
from_customuser_id=custom_user.pk)
friend_ids = list(custom_user_friends.values_list('to_customuser_id', flat=True))
for cuf in custom_user_friends:
cu = cuf.to_customuser_id
# Add the queryset to the dictionary
custom_user_non_friends[cu] = get_non_friends_for_user(cu, friend_ids)
for cu, non_friends in custom_user_non_friends.items():
display_user_info(cu, non_friends)
И это должно сделать это. Я не проверял ничего из этого, и все это в значительной степени исходит из моей головы, поэтому могут быть некоторые ошибки. Если это не работает для вас или это не то, что вы искали, просто оставьте комментарий, и я посмотрю, что я могу сделать.