Запрос к базе данных django ИЛИ условие

Я реализую систему друзей, похожую на facebook, где можно отправлять запросы на дружбу и принимать запросы, а затем видеть своих друзей. На странице, где отображаются запросы на дружбу, я пытаюсь отфильтровать пользователей, которые приняли запрос на дружбу и уже являются друзьями. В приведенном ниже коде 'u' - это текущий зарегистрированный пользователь. Таблица Friendship содержит два поля, оба внешние ключи, смотрите ниже:

    try:
                        already_friends = Friendship.objects.get(Q(from_friend=u) | Q(to_friend=u))
                        for x in already_friends.iterator():
                            my_requests = FriendRequest.objects.filter(Q(receiver=request.user) & ~Q(sender=x))
                    except ObjectDoesNotExist:


class FriendRequest(models.Model):
    sender = models.ForeignKey(User, related_name='the_sender',on_delete=models.CASCADE)
    receiver = models.ForeignKey(User, related_name='the_receiver', on_delete=models.CASCADE)
    def __str__(self):
        return "request sent"
    
    class Meta:
        unique_together = (('sender', 'receiver'),)
    
class Friendship(models.Model):
    from_friend = models.ForeignKey(User, related_name="from_friend", on_delete=models.CASCADE)
    to_friend= models.ForeignKey(User, on_delete=models.CASCADE)
    def __str__(self):
        return "Friend request accepted"
    
    class Meta:
        unique_together = (('from_friend', 'to_friend'),)

Когда я использую запрос, который я написал вверху, используя Q (сложные запросы), а затем использую iterator, я получаю следующую ошибку:

'Friendship' object has no attribute 'iterator'

Как я могу достичь того, что собираюсь сделать, используя модели/запросы django?

Вам следует использовать .filter(…) [Django-doc], а не .get(…) [Django-doc]: .get(…) извлекает единственный Friendship объект, и выдает ошибку, если такого объекта нет, или если их несколько. С другой стороны, .filter(…) вернет (возможно, пустой) набор всех Friendship записей, удовлетворяющих заданному предикату:

already_friends = Friendship.objects.filter(Q(from_friend=u) | Q(to_friend=u))
for x in already_friends.iterator():
    my_requests = FriendRequest.objects.filter(Q(receiver=request.user) & ~Q(sender=x))

Кроме того, не имеет смысла использовать Q(sender=x): x является объектом Friendship, а не пользовательским объектом. Вы, вероятно, хотите проверить, является ли from_friend_id или to_friend_id объектом u, и таким образом использовать другой объект для фильтрации. Что-то вроде:

already_friends = Friendship.objects.filter(Q(from_friend=u) | Q(to_friend=u))
for x in already_friends.iterator():
    if x.from_user_id = u.id:
        my_requests = FriendRequest.objects.filter(receiver=request.user, sender_id=x.to_user_id)
    else:
        my_requests = FriendRequest.objects.filter(receiver=request.user,  sender_id=x.from_user_id)
Вернуться на верх