Django. Anular guardar para el modelo

Antes de guardar el modelo estoy redimensionando una imagen. Pero, ¿cómo puedo verificar si se ha agregado una nueva imagen o solo una descripción actualizada, para poder omitir el cambio de escala cada vez que se guarda el modelo?

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) 

Quiero volver a escalar solo si se cargó una nueva imagen o si se actualizó una imagen, pero no cuando se actualizó la descripción.

Algunos pensamientos:

 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) 

No estoy seguro de si funcionaría bien con todas las herramientas pseudo-automáticas de django (Ejemplo: ModelForm, contrib.admin, etc.).

Compruebe el campo pk del modelo. Si es Ninguno, entonces es un nuevo objeto.

 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) 

Edición: he añadido una comprobación de ‘imagen’ en form.changed_data. Esto supone que estás usando el sitio de administración para actualizar tus imágenes. También tendrás que anular el método predeterminado de save_model como se indica a continuación.

 class ModelAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): obj.save(form=form) 

Puede proporcionar argumentos adicionales para confirmar que se ha publicado una nueva imagen.
Algo como:

 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) 

o pasar la variable de solicitud

 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) 

Creo que estos no romperán tu salvación cuando se llama simplemente.

Puede poner esto en su admin.py para que esto funcione también con el sitio de administración (para la segunda de las soluciones anteriores):

 class ModelAdmin(admin.ModelAdmin): .... def save_model(self, request, obj, form, change): instance = form.save(commit=False) instance.save(request=request) return instance 

Lo que hice para lograr el objective fue hacer esto ..

 # I added an extra_command argument that defaults to blank def save(self, extra_command="", *args, **kwargs): 

y debajo del método save () es este …

 # override the save method to create an image thumbnail if self.image and extra_command != "skip creating photo thumbnail": # your logic here 

así que cuando edito algunos campos pero no edito la imagen, pongo esto …

 Model.save("skip creating photo thumbnail") 

puede reemplazar "skip creating photo thumbnail" por "im just editing the description" o un texto más formal.

Espero que esto ayude!

Consulte la base de datos para un registro existente con el mismo PK. Compare los tamaños de archivo y las sums de comprobación de las imágenes nuevas y existentes para ver si son iguales.

En nueva versión es así:

 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 

Me he encontrado una manera sencilla de almacenar los datos en la base de datos

modelos.py

 class LinkModel(models.Model): link = models.CharField(max_length=500) shortLink = models.CharField(max_length=30,unique=True) 

En base de datos solo tengo 2 variables

vistas.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 

En este caso, he creado la instancia del modelo solo en views.py y poniendo / guardando datos en 2 variables desde solo vistas.