Django filter at query intersection?

class Item(models.Model):
    ...

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

I have a list of ItemSets. I want to find all Item objects, where the Item object is in the "items" field of M2M, at least on one of the ItemSet objects.

How can i do this?

PS This is what I tried, but to no avail:

itemset_list = [itemset1, itemset2, itemset3]    
items = Item.objects.filter(itemsets__in=itemset_list)
+5
source share
1 answer

If you need your list of item sets and you haven’t received them from the request, try the following:

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)

If you can get a list of your item sets upon request, this will shorten it a bit:

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

All Articles