Django: Obteniendo complemento de queryset

Obtengo un queryset para un determinado modelo y me gustaría obtener su complemento, es decir, todas las instancias de ese modelo que no estén en el queryset mencionado anteriormente.

¿Cómo puedo hacer eso?

Solucion corta

qs = Model.objects.filter(...) # qs with objects to exclude result = Model.objects.exclude(pk__in=qs.values_list('pk', flat=True)) 

Más solución SECA

Sin embargo, si desea utilizar la lógica muchas veces, le sugeriría que la encapsule en un método. Aquí hay un ejemplo que personalmente utilizo en un queryset personalizado:

 class QuerysetUtils: def get_queryset_complement(self, method): return self.exclude(pk__in=method().values_list('pk', flat=True)) class ExpirableQueryset(QuerysetUtils, models.query.QuerySet): def expired(self): return self.filter(expiration__lte=timezone.now()) def unexpired(self): return self.get_queryset_complement(self.expired)