Джанго. Переопределить сохранить для модели
перед сохранением модели я изменяю размер изображения. Но как я могу проверить, добавлено ли новое изображение или просто обновлено описание, поэтому я могу пропустить масштабирование каждый раз, когда модель сохраняется?
class Model(model.Model):
image=models.ImageField(upload_to='folder')
thumb=models.ImageField(upload_to='folder')
description=models.CharField()
def save(self, *args, **kwargs):
if self.image:
small=rescale_image(self.image,width=100,height=100)
self.image_small=SimpleUploadedFile(name,small_pic)
super(Model, self).save(*args, **kwargs)
Я хочу масштабировать только если новое изображение загружено или изображение обновлено, но не при обновлении описания.
7 ответов:
мысли:
class Model(model.Model): _image=models.ImageField(upload_to='folder') thumb=models.ImageField(upload_to='folder') description=models.CharField() def set_image(self, val): self._image = val self._image_changed = True # Or put whole logic in here small = rescale_image(self.image,width=100,height=100) self.image_small=SimpleUploadedFile(name,small_pic) def get_image(self): return self._image image = property(get_image, set_image) # this is not needed if small_image is created at set_image def save(self, *args, **kwargs): if getattr(self, '_image_changed', True): small=rescale_image(self.image,width=100,height=100) self.image_small=SimpleUploadedFile(name,small_pic) super(Model, self).save(*args, **kwargs)Не уверен, если он будет играть хорошо со всеми псевдо-автомобильный инструмент Джанго (например: ModelForm, ВНО.админ и т. д.).
Проверьте поле pk модели. Если его нет, то это новый объект.
class Model(model.Model): image=models.ImageField(upload_to='folder') thumb=models.ImageField(upload_to='folder') description=models.CharField() def save(self, *args, **kwargs): if 'form' in kwargs: form=kwargs['form'] else: form=None if self.pk is None and form is not None and 'image' in form.changed_data: small=rescale_image(self.image,width=100,height=100) self.image_small=SimpleUploadedFile(name,small_pic) super(Model, self).save(*args, **kwargs)Edit: я добавил чек для "изображения" в форме.данные изменения. Это предполагает, что вы используете сайт администратора для обновления изображений. Вы также должны переопределить метод save_model по умолчанию, как указано ниже.
class ModelAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): obj.save(form=form)
вы можете предоставить дополнительный аргумент для подтверждения размещения нового изображения.
Что-то вроде:def save(self, new_image=False, *args, **kwargs): if new_image: small=rescale_image(self.image,width=100,height=100) self.image_small=SimpleUploadedFile(name,small_pic) super(Model, self).save(*args, **kwargs)или передать переменную запрос
def save(self, request=False, *args, **kwargs): if request and request.FILES.get('image',False): small=rescale_image(self.image,width=100,height=100) self.image_small=SimpleUploadedFile(name,small_pic) super(Model, self).save(*args, **kwargs)Я думаю, что они не сломают ваше спасение при вызове просто.
вы можете положить это в ваш admin.py так что эта работа с админом сайта тоже (для второго из вышеперечисленных решений):
class ModelAdmin(admin.ModelAdmin): .... def save_model(self, request, obj, form, change): instance = form.save(commit=False) instance.save(request=request) return instance
то, что я сделал для достижения цели, было сделать это..
# I added an extra_command argument that defaults to blank def save(self, extra_command="", *args, **kwargs):и ниже save () метод это..
# override the save method to create an image thumbnail if self.image and extra_command != "skip creating photo thumbnail": # your logic hereпоэтому, когда я редактирую некоторые поля, но не редактирую изображение, я ставлю это..
Model.save("skip creating photo thumbnail")можно заменить на
"skip creating photo thumbnail"С"im just editing the description"или более формальный текст.надеюсь, что это помогает!
запрос базы данных для существующей записи с тем же PK. Сравните размеры файлов и контрольные суммы для новых и существующих изображений, чтобы увидеть, если они одинаковы.
в новой версии он выглядит так:
def validate(self, attrs): has_unknown_fields = set(self.initial_data) - set(self.fields.keys()) if has_unknown_fields: raise serializers.ValidationError("Do not send extra fields") return attrs
Я нашел еще один простой способ хранения данных в БД
models.py
class LinkModel(models.Model): link = models.CharField(max_length=500) shortLink = models.CharField(max_length=30,unique=True)в базе данных у меня есть только 2 переменные
views.py
class HomeView(TemplateView): def post(self,request, *args, **kwargs): form = LinkForm(request.POST) if form.is_valid(): text = form.cleaned_data['link'] # text for link dbobj = LinkModel() dbobj.link = text self.no = self.gen.generateShortLink() # no for shortLink dbobj.shortLink = str(self.no) dbobj.save() # Saving from views.pyв этом я создал экземпляр модели в views.py только и ввод / сохранение данных в 2 переменные только из представлений.
Comments