Filtro Django donde el campo ManyToMany contiene TODA la lista

Tengo un modelo CartItem con un campo ManyToMany para un modelo AttributeChoice . Entonces, por ejemplo, un CartItem puede tener AttributeChoice “Pequeño” y “Rojo”.

Luego quiero encontrar mi artículo de CartItem que ambos tienen atributos “Pequeño” y “Rojo”. Si hago lo siguiente:

 CartItem.objects.get(cart=cart, product=product, attribute__in=attribute_list) 

Donde attribute_list es una lista de objetos AttributeChoice para “Pequeño” y “Rojo”. Luego también obtendré objetos que solo tienen “Pequeño” o “Rojo”, pero no ambos.

Así que esta consulta coincidiría:

  • Cartitem A, Pequeño, Rojo
  • Cartitem B, Pequeño
  • Cartitem C, Rojo

Mientras que lo que quiero es una consulta que solo coincida con CartItem A.

Ahora … podría crear muchas declaraciones AND, pero necesito una solución que sea flexible y pueda contener 1 o 100 atributos para filtrar. Así que pasarla una lista de objetos sería genial.

Ideas?

La solución a este problema fue publicada en este hilo .

Así es como escribí mi consulta:

 CartItem.objects.filter(cart=cart, product=product, attribute__in=attribute_list).annotate(num_attr=Count('attribute')).filter(num_attr=len(attribute_list))