Django с django-cleanup не может удалить старые файлы
Имеется модель ZipPrice, описывающая детали. В модели переопределен метод сохранения, использующий PIL.Image, который преобразует загружаемый через форму файл в формат jpeg, создает дополнительный файл миниатюр и сохраняет их под нужными именами. Также используется модуль django-cleanup для удаления ненужных файлов.
models.py
from PIL import Image
class ZipPrice(models.Model):
id = models.SmallAutoField(primary_key=True)
name = models.CharField(max_length=200, unique=True)
price = models.IntegerField()
full_image = models.ImageField(upload_to='zips/',
null=False, max_length=255, default=settings.DEFAULT_IMAGE['full'])
small_image = models.ImageField(upload_to='zips/',
null=False, max_length=255, default=settings.DEFAULT_IMAGE['small'])
class Meta:
db_table = 'zip_price'
ordering = ['-full_image']
def save(self, **kwargs):
with Image.open(self.full_image).convert('RGB') as img:
output_full = BytesIO()
output_small = BytesIO()
exif = img.getexif()
img.save(output_full, format='JPEG', exif=exif)
img.thumbnail((250, 250))
img.save(output_small, format='JPEG', exif=exif)
file_name = get_random_string(length=32)
self.full_image = InMemoryUploadedFile(output_full, 'full_image', f'{file_name}_full.jpg', 'image/jpeg',
sys.getsizeof(output_full), None)
self.small_image = InMemoryUploadedFile(output_small, 'small_image', f'{file_name}_small.jpg', 'image/jpeg',
sys.getsizeof(output_small), None)
super().save()
views.py
@method_decorator(login_required, name='dispatch')
class CatalogEditZip(UpdateView):
model = ZipPrice
form_class = ZipForm
success_url = reverse_lazy('catalog_zip')
template_name = 'repair/catalog_edit_zip.html'
forms.py
class ZipForm(forms.ModelForm):
class Meta:
model = ZipPrice
fields = {'name', 'price', 'full_image'}
labels = {'name': 'Name',
'price': 'Price',
'full_image': 'Image'
}
widgets = {'name': Textarea(attrs={'cols': 50, 'rows': 4})}
Если я редактирую экземпляр модели через форму с загрузкой нового файла, то все в порядке. Если без загрузки нового файла, то происходит следующее: метод save создает 2 новых файла, что по сути является лишним, Однако django-cleanup не может удалить существующий файл, потому что он занят: PermissionError: [WinError 32] Процесс не может получить доступ к файлу, потому что файл занят другим процессом Как я могу обойти эту проблему?