Cómo agregar una columna adicional a Django QuerySet

Tengo un QuerySet with Books y me gustaría agregar un campo de score a cada resultado del libro.

 qs = Book.objects.all() 

En SQL sin formato escribiría:

 SELECT *, ( (SELECT COUNT(*) FROM votes WHERE value=1 AND book=b.id) - (SELECT COUNT(*) FROM votes WHERE value=-1 AND book=b.id) ) AS score FROM Book b; 

¿Cómo puedo lograrlo en Django? Intenté annotate() , pero parece que no es para este tipo de cosas.

Si los valores de votos posibles son solo 1 y -1, puede simplemente Book.objects.annotate(score=Sum('votes__value')) usando la anotación mencionada: Book.objects.annotate(score=Sum('votes__value')) .

Si hay más valores posibles, puede filtrar la anotación agregando .filter(votes__value__range=(1,1)) a la consulta anterior.

Si es más complejo, tendría que usar extra con select .

Raw SQL no es la única manera. Puedes usar una expresión de Value() (ver documentos aquí ):

 from django.db.models import CharField, Value MyModel.objects.all().annotate(mycolumn=Value('xxx', output_field=CharField()))