Django - 获取带过滤器的项目列表

时间:2011-05-06 07:54:15

标签: python django algorithm django-models django-views

我的模特:

Item:
    name
    desc

Type:
    name

Value:
    text
    type.ForeignKey(Type)
    item = ForeignKey(Item)

我有一个表类型的初始类型列表,假设t = [4,5,6]。现在我必须得到一个类型为t的项目列表。例如:

价值数据清单:

type  |  item
4        1
5        1
6        1
4        2
5        2
4        3

所以,如果t = [4,5,6],我需要的结果是items = [<object: 1>]

更新

t = [4,5] items = [<object: 1>, <object: 2>]

t = [4] items = [<object: 1>, <object: 2>, <object: 3>]

感谢您的帮助!!!

2 个答案:

答案 0 :(得分:2)

不太确定这是最好的解决方案,但它有效

from itertools import groupby

values = Value.objects.filter(type_id__in=t).values_list('type_id', 'item_id')
values = sorted(values, key=lambda x: x[1])

items = []
for key, group in groupby(values, lambda x: x[1]):
    types = [x[0] for x in group]
    if set(t).issubset(set(types)):
        items.append(key)

items将包含id,而不是对象,但我不认为这可能是一个问题。

答案 1 :(得分:1)

您可以通过多对多关系进行过滤,其值为:

Item.objects.filter(value__type__id__in = [4, 5, 6])

更新:以上内容适用于OR查询,以查找具有任何指定类型的所有项目。要查找包含所有类型的所有项目,您必须通过链接过滤器来创建AND查询:

q = Item.objects
for id in [4, 5, 6]:
    q = q.filter(value__type__id = id)
print q.all()
# or
q = reduce(lambda q, i: q.filter(value__type__id = i), [4, 5, 6], Item.objects)
print q.all()