¿Cómo hacer una consulta Django de muchos a muchos para encontrar un libro con 2 autores dados?

Tengo una consulta que requiere filtrar exactamente 2 autores con el ID

Teóricamente

Book.objects.filter(author__id=1, author__id=2). 

Lo que no es posible.

¿Como puedó resolver esté problema?

Saludos, Mickey

No es intuitivo al principio, pero la respuesta está justo delante de nosotros.

 Book.objects.filter(author__id=1).filter(author__id=2) 

Si desea una coincidencia exacta, podría potencialmente filtrar más este resultado por aquellos elementos que solo tienen exactamente 2 autores.

 Book.objects.annotate(count=Count('author')).filter(author__id=1)\ .filter(author__id=13).filter(count=2) 

Si quieres coincidencias exactas dinámicamente, ¿qué tal algo como esto ?:

 def get_exact_match(model_class, m2m_field, ids): query = model_class.objects.annotate(count=Count(m2m_field))\ .filter(count=len(ids)) for _id in ids: query = query.filter(**{m2m_field: _id}) return query matches = get_exact_match(MyModel, 'my_m2m_field', [1, 2, 3, 4]) # matches is still an unevaluated queryset, so you could run more filters # without hitting the database. 

Los objetos Q te ayudarán. Docs

 Book.objects.filter(Q(author__id=1) & Q(author__id=2)) 

Puede utilizar una consulta “IN”. Django docs

Book.objects.filter(author__id__in=[1,2])