Как отобразить добавленных друзей в списке друзей соответствующего пользователя?

Я разрабатываю функцию, подобную Facebook. То есть пользователь может отправить запрос на дружбу, а затем этот конкретный пользователь примет запрос на дружбу. Это означает, что они оба становятся друзьями друг друга. Теперь как я могу отобразить их таким образом, чтобы пользователь A был другом пользователя B и наоборот? Вот как я это разработал, но не могу отобразить обоих пользователей в списке друзей.

models.py:

class AddToNetwork(models.Model):
    NETWORK_CHOICES = (
        ('ADD', 'Add'),
        ('ACCEPT', 'Accept'),
        ('DELETE', 'Delete'),
    )
    id = models.UUIDField( primary_key = True, default = uuid.uuid4,editable = False)
    add_to = models.ForeignKey(User, on_delete=models.CASCADE,  related_name="add_to", null=True, blank=True)
    added_from = models.ForeignKey(User, on_delete=models.CASCADE, related_name="add_from", null=True, blank=True)
    network_status = models.CharField(max_length=30, choices = NETWORK_CHOICES)
    added_at = models.DateTimeField(auto_now_add = True)
    deleted_at = models.DateTimeField(auto_now = True)

    def __str__(self):
        return str(self.add_to)

Отправка запроса на дружбу с использованием следующего метода/логики:

def addToNetwork(request, id):
    try:
        add_to = User.objects.get(id = id)
        current_user = User.objects.get(id = request.user.id)
        network = AddToNetwork.objects.create(add_to = add_to, added_from=current_user,network_status = 'ADD')
        messages.success(request,f'Request Sent to {add_to.first_name} {add_to.last_name}')
        return redirect('userProfileDetail', id)
    except User.DoesNotExist:
        add_to = None
    return render(request,'network/network_userProfile.html')

Принятие запроса на дружбу с использованием следующей логики:

def acceptNetworkRequest(request, id):
    try:
        # if 'accept_friendRequest' in request.GET:
        friend_request = AddToNetwork.objects.get(id = id)
        print("\n Friend Request \n", friend_request)
        friend_request.network_status = 'ACCEPT'
        friend_request.save()
        messages.success(request, f'You accepted {friend_request.added_from.first_name} as a friend!')
        return redirect('friends', id)

    except AddToNetwork.DoesNotExist:
        return render(request,'network/friendRequestList.html')

Логика отображения друзей в соответствующих профилях:

def friends(request, id):


    user = User.objects.get(id = request.user.id)
    if user:
        approved_friends = AddToNetwork.objects.filter(Q(added_from_id = user),network_status = 'ACCEPT')



    context = {
        'friends': approved_friends,
        # 'approved': friend_to,
        # ' key' : value
    }
    return render(request, 'friend_list.html', context)

Теперь я хочу использовать атрибут модели add_to и added_from, чтобы я мог отображать друзей в их соответствующих профилях. На данный момент отображается либо друг, который использует атрибут add_to, либо added_from.

шаблон для friends_list:

            {% for friend in friends %}
              <tr>
                <!-- <td scope="row">{{forloop.counter}}</td> -->
                <td>{{friend.add_to.first_name}} {{friend.add_to.last_name}}</td>
                <br>
               </tr>
             </tr>
            {% endfor %}

есть ли кто-нибудь, кто может меня направить?

Способ получения списка друзей из вашей текущей модели будет выглядеть примерно так:

User.objects.filter(
    Q(add_from=user)& # get requests sent by the user
    Q(add_from__network_status='ACCEPT')| # must be accepted
    Q(add_to=user)&   # and those sent to the user
    Q(add_to__network_status='ACCEPT') # must be accepted
)

Это должно работать нормально, но вам может понадобиться другая модель, которая действительно хранит списки друзей, вы можете найти ее более лаконичной и управляемой. Например, хранить друзей как m2m-поле пользователя или иметь модель FriendList, которая хранит главного пользователя и его друзей.

Edit - мой код выше некорректен, поле add_from получает доступ к связанным объектам AddToNetwork, но затем не получает доступ к пользователям, связанным с этими объектами. Необходимо добавить __add_to и __added_from соответственно, чтобы снова получить обратно к пользователю.

get_user_model().objects.filter(
    Q(add_from__add_to=user)& # get requests sent by the user
    Q(add_from__network_status='ACCEPT')| # must be accepted
    Q(add_to__added_from=user)&   # and those sent to the user
    Q(add_to__network_status='ACCEPT') # must be accepted
)
Вернуться на верх