从django queryset中排除在另一个模型的查询集中引用的结果

时间:2012-10-22 18:23:51

标签: django django-queryset

我正在使用Django并且有两个类:

class PR(models.Model):
  Jq = models.ForeignKey(JQ)
  user = models.ForeignKey(User)
  (snip)
  def __unicode__(self):
        return self.name

class JQ(models.Model):
  a = models.ForeignKey(A)
  (snip)
  def __unicode__(self):
        return self.name

我想执行一个查询,我抓住所有不属于指定用户的PR的JQ。 现在,我这样做:

 jq = JQ.objects.filter(somefield=someval)
 pr = PR.objects.filter(user=request.user.id)
 for r in pr:
   jq = jq.exclude(id=r.Jq.id)

也就是说,我获得所有JQ,然后获取引用给定用户的所有PR。我循环遍历所有PR并排除至少一个PR引用的JQ。然而,这非常低效。有什么建议?

(顺便说一句,在本机SQL中,我可能会创建该用户PR的临时表,然后将该临时表与JQ连接起来,并且只保留用户PR中没有匹配的行。)< / p>

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

 pr = PR.objects.filter(user=request.user.id).values_list('jq__id', flat=True)
 jq = JQ.objects.filter(somefield=someval).exclude(id__in=pr)

第一行返回id列表(例如[12,14,110])。然后,您可以在排除中使用这些ID。