2011-05-10 23 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