Лучший способ заставить Django "пользовательскую" систему иметь "друзей"
Я использую систему авторизации Django для создания учетных записей в своем приложении.
Каков наилучший способ создания системы "друзей" с использованием системы авторизации? Я хочу, чтобы у меня была возможность связать пользователей вместе, но сначала они должны принять запрос друга, и я также хочу сохранить дату, когда они стали друзьями.
Ответы
Ответ 1
Поле M2M почти доставляет вас туда, но будет хранить только связь, а не дату, когда она была создана. Было бы намного проще, если бы вы могли обойтись без даты дружбы.
В противном случае вы захотите создать модель примерно так:
class Friendship(models.Model):
created = models.DateTimeField(auto_now_add=True, editable=False)
creator = models.ForeignKey(User, related_name="friendship_creator_set")
friend = models.ForeignKey(User, related_name="friend_set")
Вы хотите создать метод, возможно, в модели профиля пользователя, чтобы понять отношения. В идеале, вам должно быть что-то вроде этого:
>> User.userprofile.friends()
[{'name': "Joe", 'created': 2010-12-01},]
Ответ 2
Я сделал это:
models.py
class FriendMgmt(models.Model):
"""
friends table
"""
user = models.ForeignKey(User)
friend = models.ForeignKey(User, related_name="friends")
forms.py
class FriendMgmtForm(forms.Form):
"""
Manages friends connections
"""
friend = forms.CharField(max_length=100,required=False)
views.py
def my_friends(request):
"""
used for Displaying and managing friends
"""
if request.method == 'POST':
form = FriendMgmtForm(request.POST)
if form.is_valid():
user = User.objects.get(id=80)
friend_manage = FriendMgmt(user=request.user, friend= user)
friend_manage.save()
return HttpResponseRedirect('/myfriends/')
else:
form = PdfValidationForm()
user = request.user
profile = UserProfile.objects.get(user=user)
full_name = user.get_full_name()
email = user.email
area_interest = profile.area_of_interest
designation = profile.designation
friends = FriendMgmt.objects.filter(user=request.user)
return render_to_response('friends.html',{'form': form,
'full_name':full_name,
'email':email,
'area_interest':area_interest,
'designation':designation,
'friends':friends,
}
)
url.py
url(r'^myfriends/$',my_friends)
Ответ 3
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
#other fields
def get_friends(self):
user = self.user
return Friendship.objects.filter(Q(creator=user)|Q(friend=user))
#then you can call elsewhere
friends = user.get_profile().get_friends().all()