[EMAIL PROTECTED] wrote:
> Adrian Holovaty wrote:
> 
> 
>>This comes back to the Person.objects.all() thing that I'd mentioned
>>earlier. With all(), there's no strange special-case behavior.
>>Person.objects.all() would return a cache-filled object, and there
>>wouldn't be a need for a QuerySet to know whether it could accept
>>caching or not.
>>
>>    def some_view(request):
>>        person_list = Person.objects.all()
>>        return render_to_response('foo/person_list', {'person_list':
>>person_list})
>>
>>This would further simplify things by making a Manager's methods
>>*return* QuerySets instead of having a Manager *be* a QuerySet. The
>>downside is it's slightly more typing to do Person.objects.all() than
>>Person.objects -- but that's the only downside I see. Thoughts?
> 
> 
> Glad you brought this up, I was intending to post along similar lines.
> 
> Consider this way of creating custom managers:
> 
> goodArticles = objects.filter(score_gt=50)
> 
> Presumably this needs the same behaviour as a Manager i.e. doesn't
> cache.  So the the filter method needs to return a non-caching
> QuerySet.  To get a caching version, you would have to do .all(), so
> you would have to do this everytime you actually wanted to get data:
> 
> Article.objects.all().filter(blah..)
> 
> Would that be acceptable?  Alternatively, we could say that the above
> method of creating custom managers is wrong, and you should use
> subclassing instead.
> 
> Also, with this syntax, you could still have Managers *being* QuerySets
> (and it would probably be easier to implement it this way). All that
> happens is that they are non-caching, and all the methods on them (or
> just .all(), depending on the answer to the above) return new sets with
> caching turned on.
> 
> Finally, the other idea of using list() turns out really bad.  From
> what I can tell, list(iterable) calls __len__ on that iterable if it
> exists (after having fetched the data, for some unknown reason), so
> with the current behaviour of __len__ on QuerySets,
> list(Article.objects) fetches the data twice if caching is disabled (as
> currently).  You actually have to do list(iter(Article.objects)).
> Nasty!
> 
> Luke

I can't see a non-evil way around this ATM with the caching issue. I
think it would be clearer what is going on if the method is called
.cached() rather than .all(), though....

Robert

Reply via email to