Skip to content

Commit 920c68b

Browse files
chaoskcodingjoe
authored andcommitted
Fix #203 -- Prevent access to deferred fields in stdimage file descriptor (#204)
1 parent 1ff71ac commit 920c68b

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

stdimage/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ def set_variations(self, instance=None, **kwargs):
240240
241241
:param instance: FileField
242242
"""
243-
if getattr(instance, self.name):
243+
deferred_field = self.name in instance.get_deferred_fields()
244+
if not deferred_field and getattr(instance, self.name):
244245
field = getattr(instance, self.name)
245246
if field._committed:
246247
for name, variation in list(self.variations.items()):

tests/test_models.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,20 @@ def test_custom_render_variations(self, db):
167167
assert instance.image.thumbnail.width == 100
168168
assert instance.image.thumbnail.height == 100
169169

170+
def test_defer(self, db, django_assert_num_queries):
171+
"""
172+
`set_variations` does not access a deferred field.
173+
174+
Accessing a deferred field would cause Django to do
175+
a second implicit database query.
176+
"""
177+
instance = ResizeModel.objects.create(image=self.fixtures['100.gif'])
178+
with django_assert_num_queries(1):
179+
deferred = ResizeModel.objects.only('pk').get(pk=instance.pk)
180+
with django_assert_num_queries(1):
181+
deferred.image
182+
assert instance.image.thumbnail == deferred.image.thumbnail
183+
170184

171185
class TestUtils(TestStdImage):
172186
"""Tests Utils"""

0 commit comments

Comments
 (0)