On Wed, Mar 23, 2011 at 8:49 PM, Brian Neal <[email protected]> wrote:
> items = Post.objects(filter=forum__topic__in=forums).order_by('-
> topic__update_date', '-update_date').select_related(# as before)[:30]
>
> But this had the same result as before. I checked the resulting SQL,
> and it looked right, so I did an explain and it was pretty much as
> before. It decided not to use the index.
bummer :-(
> So I broke it up into two queries:
>
> topic_ids = list(Topic.objects.filter(forum__in=forums).order_by(
> '-update_date').values_list('id', flat=True)[:30])
> items = Post.objects.filter(topic__in=topic_ids).select_related(# as
> before)[:30]
did you try:
items =
Post.objects.filter(topic__in=Topic.objects.filter(forum__in=forums).order_by('-update_date')[:30]).select_related(#
as before)[:30]
IOW: use the first queryset for the '__in' clause, no need to flatten
to a list of IDs. that allows the ORM to weave a subselect (see
http://docs.djangoproject.com/en/1.3/ref/models/querysets/#in).
unfortunately, the docs also warn about the less-than-ideal MySQL
optimizer, so in many cases it turns to be faster to do just like you
did. (i guess that specially in these limited-size queries).
--
Javier
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en.