No, querysets make one single call to the database when called as an iterable.  They do not query a row at a time.  See the first item, labeled "Iteration" in this doc: https://docs.djangoproject.com/en/1.6/ref/models/querysets/

If we did `user_ids[start:min(start+batch_size, total)]` as before, then it would produce a separate query for each batch.  I chose to recode it as a single query to gain better simplicity and efficiency.  Since we are only returning a values_list of integers (which doesn't consume very much memory), a single query seems the better choice.  However, if you are concerned about the potential for memory usage when this is run on extremely large databases (for example tens of millions, or hundreds of millions of records), then I would suggest using the `queryset.iterator()` function instead of slicing the query.  The `queryset.iterator()` function will still only make a single database query, but Django will not keep an internal cache of the results, thus saving memory.  In this case, we only reference the iterated results once, so it's safe to not have the Django cache.  See this documentation:
https://docs.djangoproject.com/en/1.6/ref/models/querysets/#iterator

Let me know what you think...