2011-05-10 53 views
18

如何做到這一點使用Django對象查詢:Django的查詢,其中在

SELECT * FROM test WHERE (test_id IN (SELECT test_id FROM test_subject_set)) AND (test_begin_time < '') AND (test_end_time > '') 

型號:

class Test(models.Model): 
    id = models.AutoField(primary_key=True) 
    user = models.ForeignKey(User) 
    groups = models.ManyToManyField(Group) 


class TestSubjectSet(models.Model): 
    id = models.AutoField(primary_key=True) 
    test = models.ForeignKey(Test) 
+1

請爲此顯示您的django模型。並且在你想要完成的內容中更具描述性 – gruntled 2011-05-10 12:30:41

回答

24

兩個查詢集是這樣做的documented方式。無論如何,這將是一個數據庫。

test_ids = Subject.objects.all() 
result = Test.objects.filter(test_id__in=test_ids).filter([some other filtering]) 
+0

感謝您的鏈接,我會試試看。 – kelvinfix 2011-05-10 12:40:14

+0

鏈接已死。使用http://docs.djangoproject.com/en/1.9/ref/models/querysets/#in – neodelphi 2016-02-15 21:57:29

+0

@neodelphi更新了鏈接,謝謝 – DrTyrsa 2016-02-16 08:21:00

6

DrTyrsa就是這麼做的。

test_ids = list(TestSubjectSet.objects.all().values_list('test_id', flat=True)) 
result = Test.objects.filter(id__in=test_ids, test_begin_time__lt='', test_end_time__gt='') 

的方式Tyrsa是這樣做不會給你TestSubjectSet測試ID的列表,而是給你一個TestSubjectSet查詢集。

此外,我被test_begin_time和test_end_time字段弄糊塗了,因爲你沒有在你的模型中提及它們。

更新:在查詢集上使用了list(),因爲根據DrTyrsa發佈的鏈接,數據庫「沒有很好地優化嵌套查詢集」。

+0

謝謝Bryce Siedschlaw。它是否通過使用Values_list有所不同? – kelvinfix 2011-05-10 14:38:23

+0

對不起,我不明白你的問題。 values_list函數將返回每個TestSubjectSet記錄中的test_id。所以,你最終會得到一個與測試記錄關鍵字相關的整數列表。 – 2011-05-10 15:25:42

+0

@Bryce Siedschlaw你錯了。查詢集是懶惰的,'test_ids'只會在第二行計算,產生完全相同的SQL查詢。如果你想做兩個平坦的SQL查詢(而不是一個嵌套的),你應該寫'id__in = list(test_ids)',但是兩個變量都得到相同的結果。 – DrTyrsa 2011-05-10 16:10:08