我的模特:
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>]
感谢您的帮助!!!
答案 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()