Am 27.09.2011 um 05:18 schrieb Luke Plant: > On 27/09/11 03:23, Alex Gaynor wrote: > >> I'm not a fan of this, for a few reasons, firstly: because it feels >> wrong for a QuerySet to execute multiple queries. This isn't a deal >> breaker, just something that struck my conceptually initially. Second I >> disagree that it's difficult to do outside of core, it's not as easy as >> it ought to be, but it's very possible (citation: I've done it :)). > > Would you like to share your solution? I found it pretty difficult to > come up with anything that: > > 1) could be done on a per-query basis and > 2) didn't require changes to the code that would use the QuerySet > objects i.e. fully API compatible.
I don't believe (2) is an important requirement. It may even be counter-productive. For me, the ideal solution would allow to filter or annotate the prefetched QuerySet – and thus, obj.relmanager.all() would be a bad API to access the prefetched objects. I'd like to propose something that works more like annotations: >>> Foo.objects.prefetch_related(related_list=Foo.related_objects.filter(x__gt=42)) This would require related object descriptors to return something like a ParametrizedQuerySet object when accessed via the model class, e.g.: >>> Foo.related_set.filter(x__gt=42).apply(*foo_objects) # equivalent to: Related.objects.filter(foo__in= foo_objects).filter(x__gt=42) Or, simpler, but less generic: >>> Foo.related_set.filter(x__gt=42) 'foo', Related.objects.filter(x__gt=42) This syntax would also make it somewhat obvious that you're going to use more than one db query. Finally, and to support Alex point, if you drop your second requirement, it's well possible to implement this (modulo my proposed API) with the public QuerySet API + some introspection. __ Johannes -- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.