Django:按交集结果过滤查询集

时间:2013-04-26 15:20:48

标签: python sql django postgresql orm

假设我有一个项目模型,它与功能的M2M关系:

class Item(models.Model):
    features = models.ManyToManyField(to = 'Feature')

现在我想过滤Item查询集,只包含至少具有所有指定功能的项目。

让我们说可能的功能包括:CameraTouchscreenKeyboard

现在我想选择所有两者相机和键盘的项目

任何解决方案?

2 个答案:

答案 0 :(得分:2)

假设Feature的模型有一个名为“name”的字段,您可以在值列表中过滤与该字段匹配的项目。像这样的东西会起作用:

Item.objects.filter(features__name__in=['Camera', 'Touchscreen', 'Keyboard'])

<强>更新

正如stalk所说here,要获取与所有功能相匹配的项目,您需要对查询进行多次“过滤”。动态获取它的方法是:

features = ['Camera', 'Touchscreen', 'Keyboard']
items = Item.objects.all()

for feature in features:
  items = items.filter(feature__name=feature)

通过这种方式,您可以传递动态功能列表以匹配项目。

答案 1 :(得分:1)

如果您的要素模型使用名称字段,那么这应该有效:

Items.objects.filter(features__name='Camera', features__name='Keyboard')

修改 上述查询中的语法错误。应该将2个过滤器链接在一起:

Items.objects.filter(features__name='Camera').filter(features_name='Keyboard')