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)