1

假设我有一个与 Feature 存在 M2M 关系的 Item 模型:

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

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

可以说可能的特征是:Camera, Touchscreen,Keyboard

现在我想选择所有同时具有相机和键盘的项目

任何解决方案?

4

2 回答 2

3

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

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

更新:

正如stalk这里所说,要获得与所有功能匹配的项目,您需要对查询执行许多“过滤器”。动态获取它的一种方法是:

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

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

通过这种方式,您可以传递动态的特征列表来匹配项目。

于 2013-04-26T15:32:08.703 回答
1

如果您的特征模型使用名称字段,那么这应该可以工作:

Items.objects.filter(features__name='相机', features__name='键盘')

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

Items.objects.filter(features__name='Camera').filter(features_name='Keyboard')
于 2013-04-26T15:38:55.330 回答