4

私はDjangoを使用しており、2つのクラスがあります:

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 をループして、少なくとも 1 つの PR によって参照されている JQ を除外しています。しかし、これは恐ろしく非効率的です。助言がありますか?

(ところで、ネイティブ SQL では、おそらくそのユーザーの PR の一時テーブルを作成し、その一時テーブルを JQ と結合して、ユーザーの PR に一致しない行のみを保持します。)

ご協力ありがとうございました!

4

1 に答える 1

4
 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 を除外で使用します。

于 2012-10-22T18:45:33.700 に答える