2013-05-25 71 views
0

我有一個模型來追蹤追隨者。這與其他所有社交網站類似。Django內心加入自我。有沒有更高效的方法?

現在我的模型看起來像這樣。

class Follow(models.Model): 
    follower = models.ForeignKey(UserProfile, related_name='follower') 
    following = models.ForeignKey(UserProfile, related_name='following') 
    follow_date = models.DateTimeField(auto_now_add=True) 

今天我去添加了一些需要相互關係的功能。人a遵循b和b遵循a。我想包括當前登錄用戶以及我使用Q.

mutual_follows_qs = Follow.objects.raw('select o.* from follow o ' + \ 
             'inner join follow f ' + \ 
             'on o.following_id = f.follower_id' + \ 
             ' and o.follower_id = f.following_id' + \ 
             ' where o.follower_id = %s', [str(request.user.pk)]) 
mutual_follows = [] 
for mutual_follow in mutual_follows_qs: 
    mutual_follows.append(mutual_follow.following.pk) 
possible_users = User.objects.filter(Q(pk__in=mutual_follows) \ 
             | Q(pk=request.user.pk)).order_by('username') 

我正在執行多個查詢。呸。我正在建立一個從我的原始列表到Q(pk__in=mutual_follows)中使用的列表。呸。我很好奇人們有什麼建議來提高這種邏輯的效率。

這裏是UserProfile模型

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    ... 
    follow = models.ManyToManyField('self', blank = True, 
            symmetrical=False, through='Follow') 
    ... 

回答

1

我不能完全確定你想要達到的,但如果我得到它的權利,你想爲哪個Follow對象存在的所有用戶,其中request.use是追隨者和其中request.user之後(我認爲related_names有點混淆)。

在你的源代碼,您使用的UserProfileUser模型,不知道這是一個錯字或故意的,但假設有隻User模型這可能工作:

user = request.user 
users = User.objects.filter(
    Q(Q(follower__follower=user) & Q(following__following=user)) | 
    Q(pk=user.pk))).distinct() 
+0

我一直有點困惑在我應該把我的相關名字,他們混淆道歉。我想我沒有添加UserProfile模型到我的問題,但我現在已經更新它。假裝Follow表只有兩條記錄,就會有一條說跟隨者= a,跟隨= b,另一個跟隨者= b,跟隨= a。這兩個記錄存在的事實意味着他們都相互關注。我認爲使用你的代碼會說用戶正在關注自己。我更新的帖子和評論是否有助於澄清?謝謝你的幫助。 – wilbbe01

+0

不,它沒有說他在追隨自己......關係(追隨者/追隨者)實際上是一組對象(外鍵的反向關係,1:n關係),所以像'follower__follower = user '意味着類似的東西「,在這組跟隨記錄中存在一個對象,其中字段'follower = user'」... –

+0

好的。疑難雜症。 'Q(Q(follower__following = user)&Q(following__follower = user))'做。至少這給了我預期的結果,其中最初只給予用戶。謝謝。 – wilbbe01

相關問題