easy-thumbnails
easy-thumbnails copied to clipboard
Getting all your thumbnails at once from a list of objects
I'm using the template version of thumbnail generation/display, but I noticed through profiling that I have ~100 DB queries on pages that use a lot of thumbnails (looping through each object with {% thumbnail blahblah %} ), and it's from doing every individual select from easy_thumbnails_source and easy_thumbnails_thumbnail.
I looked into selecting all thumbnails in bulk given a list of object ID's or something like that, but it doesn't seem possible. Could something like that be added, or am I missing an obvious way to accomplish it?
Yes, I started napkin planning this feature but haven't implemented anything in code.
Having a way of bulk selecting certain aliases for a queryset would be great. If you want to have a first crack at it then go right ahead.
PS: you might want to try master, it may reduce some queries. I'll release as an official version soon, hopefully.
Ok, that would be a good side project actually. Thanks.
Any progress on this? Is there any way to use select_related() or prefetch_related() on a queryset to reduce the number of database lookups of thumbnails?
Hi ... I'm also wondering has this beend moved from napkin stage. Can anything be done to help out/speed things regarding this.
+1 to prior comments. I often end up with views with several hundred queries. I will definitely poke around and look at reducing query counts myself before I switch to sorl, but that's becoming a definite option.
Another alternative is to introduce a memcached backed engine similar to django.contrib.sessions.backends.cached_db
. While it doesn't necessarily reduce query counts, it will at least take the load off your main DB.
I've also been experimenting with a brand new library designed with pluggable metadata backend, remote storages and image post processing in mind. It's a young project and is definitely lacking in documentation, but I've been using it in production for a few months: https://github.com/ui/django-thumbnails
Any news on this?
Yeah, check out https://github.com/SmileyChris/easy-images
Its in a late alpha stage, feedback from usage in real world projects would be appreciated.
On Sat, 18 Feb 2017, 7:19 AM Lee Semel [email protected] wrote:
Any news on this?
— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/SmileyChris/easy-thumbnails/issues/245#issuecomment-280726659, or mute the thread https://github.com/notifications/unsubscribe-auth/AAGtf1SuUg0fMxW8o16QfKjYgwKfEGsIks5rdeTNgaJpZM4A0D2G .
If anybody is still using easy_thumbnails and needs this feature to avoid thousands of errant DB queries, it can be done by querying easy_thumbnails models directly. Generally not recommended but if unavoidable if you're in a situation similar to my own, with your thumbnailer being a bottleneck causing a view to take several seconds to load.
Something like this:
from django.conf import settings
from django.db.models import Subquery, OuterRef
from easy_thumbnails.models import ThumbnailDimensions
def annotate_queryset_with_thumbnails(queryset, thumbnail_size):
width, height = thumbnail_size = settings.THUMBNAIL_ALIASES['my.Thumbnail.alias'][thumbnail_size]['size']
size_name = f'_{thumbnail_size[0]}x{thumbnail_size[1]}.' # Contains `_` prefix and `.` suffix to avoid false positives
thumbnails_subquery = Subquery(
Thumbnail.objects.filter(
source__name=OuterRef('image'), # Original image name should be exact match
name__icontains=size_name,
).values('name')[:1]
)
return queryset.annotate(thumbnail=thumbnails_subquery)
This assumes that your ThumbnailerImageField
is defined on your model with the field name image
. You can change the OuterRef
to be whatever your model uses.
Doing this bypasses all of the side-effects of the actual thumbnailer, primarily the actual generation of thumbnails when they don't exist. I recommend in your view or serializer or wherever that you fall back to the thumbnailer for the objects in your queryset that turn up null.
@Checkroth, any other alternative to easy_thumbnails? I'm struggling with this with tons of nested serializers