2012-05-06 13 views
5
class Item(models.Model): 
    ... 

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

Tengo una lista de ItemSets. Quiero encontrar todos los objetos Item donde el objeto Item se encuentra en el campo M2M "items" en al menos uno de los objetos ItemSet.Django filter on queryset intersection?

¿Cómo puedo hacer esto?

P.S. Esto es lo que he intentado, pero fue en vano:

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

¿Ha cometido un error? ¿Qué pasó cuando lo intentaste? Además, ¿de dónde obtiene la lista de conjuntos de elementos? ¿Hizo una consulta para ellos? – Paragon

Respuesta

7

Si necesita que su lista de conjuntos de elementos y que no reciba de una consulta, intente esto:

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) 

Si es posible Obtenga su lista de elementos al consultar, que la acorta un poco:

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