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

1 投票
2 回答
2119 浏览
提问于 2025-04-16 17:06

我的模型:

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,而不是具体的对象,不过我觉得这应该没什么问题。

撰写回答