Django - 获取带过滤器的项目列表
我的模型:
Item:
name
desc
Type:
name
Value:
text
type.ForeignKey(Type)
item = ForeignKey(Item)
我最开始有一个类型的列表,来自表格Type,假设这个列表是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 个回答
1
你可以在一个多对多的关系中进行筛选,条件是:
Item.objects.filter(value__type__id__in = [4, 5, 6])
更新:上面的方式适用于“或”查询,也就是查找所有包含任意指定类型的项目。如果你想查找所有包含所有指定类型的项目,就需要通过连接多个筛选条件来创建一个“与”查询:
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()
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,而不是具体的对象,不过我觉得这应该没什么问题。