2012-09-26 58 views

回答

18
foo_queryset = Foo.objects.filter(attr=value) 
referenced_bars = Bar.objects.filter(id__in=foo_queryset.values('bar_id')) 
+1

這裏到['in']鏈接(https://docs.djangoproject.com/en/dev/ref/models/querysets /#in)在文檔中查找字段。 –

+0

我很好奇,這是多高效,有沒有辦法更有效地做到這一點? – Algorithmatic

+0

@Algorithmatic - 這是一個非常廣泛的問題,它取決於您使用的數據庫,數據和索引。在MySQL上運行它可能會非常慢,因爲MySQL在處理Django生成的子查詢時非常糟糕。爲了解決這個問題,你可以執行1個查詢來獲得'bar_ids',然後將它傳遞給'__in'子句'Bar.objects.filter(id__in = set(foo_queryset.values('bar_id')))'顯然if你有很多'Foo'對象,這也可能很慢 –

0
bars = Bar.objects.filter(foo_set__attr=value) 
+0

我的'QuerySet'包含相關的'Foo'在哪裏? – Kimvais

+0

我認爲 - 那個想法可能是錯誤的 - 這將是最容易忽略的querset(一個對象不太在意)。相反,將這個初始qeryset的限制/過濾器直接應用於酒吧。基本上,foo_set__attr = value只是一個佔位符,你可以擴展到任何你想定義你想使用的Foo的東西。這會幫助還是堅持使用單獨的Foo查詢集? – schacki

相關問題