Как отобразить добавленных друзей в списке друзей соответствующего пользователя?
Я разрабатываю функцию, подобную 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
)