2017-03-28 5 views
0
class Person(TimeStampedModel): 
    name = models.CharField(max_length=32) 
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children') 
    is_child = models.BooleanField(default=False,) 

親が存在する場合、すべての子を除外するクエリを作成しようとしています。子どもは、私のPostgreSQLではモデルのエントリの30%を占めています。Django:親がクエリに含まれている場合、すべての子を除外するクエリ

私のアプローチはnested queryです。しかし、私はそれが最も効率的な解決策であるとは確信していません。

私はあなたの助けに感謝します。

更新

私が思いついたのpythonのソリューションは以下の通りです:

a = Person.objects.filter(...) 
ids = [i.id for i in a] 
result = [x for x in a if any((not x.is_child, x.parent_id not in ids))] 
+1

を、私は表示されません元のクエリを実行し、結果からPythonコードで子を除外するだけではありません。しかし、クエリ時間を測定するのがおそらく最善の方法です。ネストされたクエリを使用するあなたのアプローチは、ところでPostgreSQLで正常に動作するはずです。 – dirkgroten

+0

@dirkgroten確かに、これは良い点です、私はそれをテストします、ありがとう! – raratiru

答えて

1

このお試しください:なぜあなたのパフォーマンスの面では

qs0 = Person.objects.filter(...) 
qs = qs0.exclude(is_child=True, parent__in=qs0) 
関連する問題