2016-02-11 41 views
0

加入我的人,其中有一個外鍵User左外Django的

p = Personne.objects.get(user=self.request.user) 

此人有「朋友」,通過那裏的一個src的人,一個dst人模型PersonneRelation,所以我「M檢索所有的人的朋友是這樣的:

friends = [a.dst.pk for a in PersonneRelation.objects.filter(src=p)] 

我有嵌入了一個旅遊的描述模型Travel。我還有一個模型「活動」,這是朋友當前用戶已完成的活動(Activite)。因此,這裏是我檢索所有與當前用戶的活動方式:

context['activites'] = Activite.objects.filter(
    Q(travel__personne__pk__in=friends) | Q(relation__src__pk__in=friends), 
) 

,一切工作正常。我還有一個型號爲PersonneLiked的地方,如果你喜歡Activite,你可以精確到。因此這個模型有一個外鍵Activite

class PersonneLiked(models.Model): 
    src = models.ForeignKey('Personne', related_name='liked_src') 
    dst = models.ForeignKey('Personne', related_name='liked_dst') 
    activite = models.ForeignKey('Activite', related_name='liked_activite') 
    # liked = thumb added *OR* removed : 
    liked = models.BooleanField(default=True) 

什麼代碼我應該做檢索所有context['activites']PersonneLiked?這就像在SQL中創建一個OUTER JOIN,但我不知道如何用Django做到這一點。

+0

爲什麼這個子句'Q(relation__src__pk__in = friends)',爲什麼PersonneLiked也有src和dst?這種關係不是保存在一個地方嗎? –

回答

0

由於context['activities']是適當的Activite對象的查詢集,那麼你可以這樣做:

PersonneLiked.objects.filter(activite__in=context['activities']) 

(請注意,如果這是一個M2M的關係,而不是一個ForeignKey,這種方法將在最終的查詢集創建重複項)

+0

'context ['liked'] = [a.activite for PersonneLiked.objects.filter( activite__in = context ['activites'], liked__exact = True)]' –