【问题标题】:Django query where inDjango查询在哪里
【发布时间】:2011-08-22 10:35:36
【问题描述】:

如何使用 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)

【问题讨论】:

  • 请为此展示您的 django 模型。更详细地描述您要完成的工作也无妨

标签: django django-queryset


【解决方案1】:

两个查询集是documented 这样做的方式。无论如何,这将是一个数据库命中。

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

【讨论】:

  • 谢谢你的链接,我试试看。
【解决方案2】:

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 发布的链接,数据库“不能很好地优化嵌套查询集”。

【讨论】:

  • 谢谢布莱斯 Siedschlaw。使用 Values_list 有什么不同吗?
  • 对不起,我不明白你的问题。 values_list 函数将返回每个 TestSubjectSet 记录中的 test_ids。因此,您最终会得到一个与测试记录的键相关的整数列表。
  • @Bryce Siedschlaw 你错了。查询集是惰性的,test_ids 只会在第二行进行评估,生成完全相同的 SQL 查询。如果你想创建两个平面 SQL 查询(而不是一个嵌套),你应该写 id__in=list(test_ids),但两个变量得到相同的 result
  • 我想我以前从未见过这种方法。它似乎不起作用。我的意思是,您正在使用 TestSubjectSet 查询集过滤测试模型上的 id 字段。过滤器函数是否自动知道要查看所有 TestSubjectSet 记录的 test_id 字段?如果是这样,那么我已经做错了很长时间了。
  • 我一定遗漏了一些东西...我刚刚在一个测试项目中尝试了您的代码,它出现了一个错误,指出 __in 过滤器需要一个整数而不是模型实例。
【解决方案3】:

我的这个工人:

Line.objects.filter(pk__in=[1, 2, 3])

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    相关资源
    最近更新 更多