Django过滤查询集交集?

时间:2012-05-06 18:38:39

标签: django django-models many-to-many set intersection

class Item(models.Model):
    ...

class ItemSet(models.Model):
    items = models.ManyToManyField(Item, related_name="itemsets")

我有一个ItemSet列表。我想找到所有Item对象,其中Item对象位于至少一个ItemSet对象的“items”M2M字段中。

我该怎么做?

P.S。这是我尝试过的,但无济于事:

itemset_list = [itemset1, itemset2, itemset3]    
items = Item.objects.filter(itemsets__in=itemset_list)

1 个答案:

答案 0 :(得分:9)

如果您需要项目集列表,而您没有从查询中获取它们,请尝试以下方法:

itemset_list = [itemset1, itemset2, itemset3]
itemset_list_ids = [itemset.id for itemset in itemset_list]
itemset_queryset = ItemSet.objects.filter(id__in=itemset_list_ids)
items = Item.objects.filter(itemsets__in=itemset_queryset)

如果您可以通过查询获取项目集列表,则会稍微缩短它:

itemset_queryset = ItemSet.objects.filter(SOME FILTER HERE)
items = Item.objects.filter(itemsets__in=itemset_queryset)