组合多个django结果集

时间:2012-01-09 11:38:28

标签: python django

我有2个django模型:

class Foo(models.Model):
    baz = models.CharField()

class Bar(models.Model);
    foo = models.ForeignKey(Foo)
    qux = models.CharField()

包含以下数据:

Foo
id baz
4  X
5  Y
6  Z

Bar
id foo_id qux
1  4      A
2  5      A
3  5      B
4  6      B

现在我在Bar上做了2个查询,在qux上过滤:

resA = [1, 2] (actually bar instances; shown bar.id for convenience)
resB = [3, 4] (actually bar instances; shown bar.id for convenience)

现在,将这些列表组合在一起的最快方法是什么,结果将是:

resAND = [5] (foo.id)

现在我做:

ret = []
nr_sets = 2
foos = Foo.objects.all()
bars = list(resA + resB)
for foo in foos:
    test = filter(lambda bar : bar.foo_id == foo.id, bars)
    if test == nr_sets;
        ret.append(foo)
然而,这是非常缓慢的。加速这个的任何想法?我特别关注查询后的解决方案,但也欢迎有关查询的好主意。

2 个答案:

答案 0 :(得分:1)

你可以尝试

foo_ids = set(resA.values_list('foo_id', flat=True)) & \
    set(resB.values_list('foo_id', flat=True))

然后,您可以使用

获取相应的完整Foo个对象
ret = Foo.objects.in_bulk(foo_ids).values()

修改:使用了set,因为&显然ValueQuerySet无法正常工作。

答案 1 :(得分:0)

为什么不:

Bar.objects.filter(foo__id=5)

您还可以在其中添加其他过滤器参数,默认情况下它们是AND。