与Django左外连接

时间:2016-02-11 12:03:21

标签: django django-models

我有一个人,其中有User的外键:

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

此人通过模型PersonneRelation拥有“朋友”,其中有src个人和dst个人,因此我正在检索所有此人的朋友:

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)

我应该采取哪些代码来检索PersonneLiked的所有context['activites']?这就像在SQL中创建OUTER JOIN,但我不知道如何用Django做到这一点。

1 个答案:

答案 0 :(得分:0)

由于context['activities']是相应Activite个对象的查询集,因此您可以这样做:

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

(请注意,如果这是一个M2M关系而不是ForeignKey,则此方法会在您的最终查询集中创建重复的条目。)