2009-12-02 106 views
0

我在列出這類數據時遇到困難。場景 如下:友誼關係問題

  1. user1的添加是一個朋友打來電話用戶2
  2. user2的確認user1的是他的朋友

什麼應該發生的是用戶2和用戶1看到的每個人的名字在他們的 好友列表。現在發生的事情是我可以將user2添加到user1 好友列表,但user1不能在他/她的列表中看到user2。我的問題 是如何讓user1出現在user2的列表中,並且user2在用戶的朋友列表中顯示 如果用戶確認了友誼?我是利用模型確認狀態的 思維和因爲 是user1和user2的id是在雙方確認的關係我 這裏看不到任何完整性問題。有小費嗎?

友誼模式:

class Friendship(models.Model): 
     NOT_CONFIRMED = 1 
     PENDING= 2 
     CONFIRMED = 3 

     STATUS_CHOICES = (
       (NOT_CONFIRMED, 'Not Confirmed'), 
       (PENDING, 'Pending'), 
       (CONFIRMED, 'Confirmed'), 
     ) 
     from_friend = models.ForeignKey(User, related_name='friend_set') 
     to_friend = models.ForeignKey(User, related_name='to_friend_set') 
     confirmed = models.IntegerField(choices=STATUS_CHOICES, 
default=NOT_CONFIRMED) 

     class Meta: 
       unique_together = (('to_friend', 'from_friend'),) 

     def __unicode__(self): 
       return '%s, %s' % (self.from_friend.username, 
self.to_friend.username) 

視圖來渲染友誼(你可以看到,我一直在玩 與過濾):

@login_required 
def friends_list(request, username): 
     user = get_object_or_404(User, username=username) 
     #friends = [friendship for friendship in user.friend_set.filter(Q 
(confirmed=2) | Q(confirmed=3))] 
     friends = Friendship.objects.filter(
       Q(to_friend=user) | Q(confirmed=3) 
     ) 

     # get friends latest 10 shows 
     friend_shows = Show.objects.filter(user__in=friends).order_by('-id') 
     return render_to_response('habit/friends_list.html', { 
       'user': request.user, 
       'friends': friends, 
       'shows': friend_shows[:10], 
       'username': username, 
     }) 

回答

1

這不是很明顯,你們的友誼模式關聯。我的朋友是否列出我是from_user的所有友誼?或者是我所有的朋友關係是from_user還是to_user

如果是前者,那麼每一位朋友的關係由兩個友誼對象表示,一個表示你是我的朋友,和一個表明我是你的朋友。每當用戶提出請求時,你都會添加兩個友誼。狀態將表明提出請求的人是from_user還是to_user。當確認或拒絕請求時,您將更新兩個友誼以反映這一點。

如果是後者,則每個朋友關係都由一個友誼對象表示。在這種情況下,您的對象設計需要記錄關係中哪位朋友提出了請求,以便在檢查對象時可以告訴哪個用戶可以將請求轉變爲已確認的友誼。

0

基於此頁:http://docs.djangoproject.com/en/dev/topics/db/queries/

下面的代碼:

friends = Friendship.objects.filter(
     Q(to_friend=user) | Q(confirmed=3) 
) 

等同於:to_friend = user OR confirmed = 3。根據你的描述,這可能不是你想要的。

這看起來更接近你想要什麼:

friends = Friendship.objects.filter(
     Q(to_friend=user) | Q(from_friend=user) 
     , Q(confirmed=3) 
)