2017-03-28 79 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%。我的方法是使用nested query。但是,我不確定這是否是最有效的解決方案。Django:排除所有子級的查詢,如果父級包含在查詢中

我將不勝感激您的幫助。

更新

我想出了一個解決方案蟒是:

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)