【问题标题】:Left outer join with Django与 Django 的左外连接
【发布时间】:2016-02-11 12:03:21
【问题描述】:

我有一个人,他有一个指向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)

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

【问题讨论】:

  • 为什么这个子句是Q(relation__src__pk__in=friends),为什么PersonneLiked还有src和dst?关系不是保存在一个地方吗?

标签: django django-models


【解决方案1】:

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

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

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

【讨论】:

  • context['liked'] = [a.activite for a in PersonneLiked.objects.filter( activite__in=context['activites'], liked__exact=True)]
猜你喜欢
  • 2011-10-01
  • 2016-10-29
  • 1970-01-01
  • 2016-01-01
  • 2021-09-02
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多