@@ -67,11 +67,15 @@ class Image(BaseFile):
6767 )
6868
6969 def get_fullsize_version (self , mimetype : str ) -> "ImageVersion | None" :
70- """Return the ImageVersion for the fullsize version of this mimetype for this Image."""
71- try :
72- return self .image_versions .get (width = self .width , aspect_ratio = self .aspect_ratio , mimetype = mimetype ) # type: ignore[no-any-return]
73- except ImageVersion .DoesNotExist :
74- return None
70+ """Return the ImageVersion for the fullsize version of this mimetype for this Image.
71+
72+ Performance sensitive, called from template tags, do not break prefetching. Loop over
73+ self.image_version_list instead of self.image_versions.filter().
74+ """
75+ for image in self .image_version_list :
76+ if image .width == self .width and image .aspect_ratio == self .aspect_ratio and image .mimetype == mimetype :
77+ return image # type: ignore[no-any-return]
78+ return None
7579
7680 def create_jobs (self ) -> None :
7781 """Create jobs for exif, smaller versions and thumbnails for this image."""
@@ -131,7 +135,11 @@ def create_smaller_version_jobs(self) -> None:
131135 def get_versions (
132136 self , mimetype : str | None = None , aspect_ratio : Fraction | None = None
133137 ) -> dict [Fraction | None , dict [str , dict [int , "ImageVersion" ]]]:
134- """Get image versions. Return a dict with ratio: mimetype: size: ImageVersion dicts."""
138+ """Get image versions. Return a dict with ratio: mimetype: size: ImageVersion dicts.
139+
140+ Performance sensitive, called from template tags, do not break prefetching. Loop over
141+ self.image_version_list instead of self.image_versions.filter().
142+ """
135143 versions = {}
136144 kwargs = {
137145 "aspect_ratio" : aspect_ratio or self .aspect_ratio ,
@@ -140,7 +148,11 @@ def get_versions(
140148 if mimetype :
141149 kwargs ["mimetype" ] = mimetype
142150 # use requested custom AR or Image original AR
143- for version in self .image_versions .filter (** kwargs ):
151+ for version in self .image_version_list :
152+ if version .aspect_ratio != kwargs ["aspect_ratio" ]:
153+ continue
154+ if "mimetype" in kwargs and version .mimetype != kwargs ["mimetype" ]:
155+ continue
144156 if version .aspect_ratio not in versions :
145157 versions [version .aspect_ratio ] = {}
146158 if version .mimetype not in versions [version .aspect_ratio ]:
@@ -229,7 +241,7 @@ class ImageVersion(ImageModel, BaseModel):
229241 )
230242
231243 image = models .ForeignKey (
232- "images.Image " ,
244+ "files.BaseFile " ,
233245 on_delete = NP_CASCADE , # delete all versions when an Image is deleted
234246 related_name = "image_versions" ,
235247 help_text = "The Image this is a smaller version of." ,
0 commit comments