在某些情况下,Django 仅覆盖模型的保存?
- 2025-01-22 08:46:00
- admin 原创
- 84
问题描述:
在保存Model
实例之前,我需要重新调整大小image
。如何检查是否添加了新图片或仅更新了描述?这样每次保存模型时我都可以跳过重新缩放。
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)
我只想在加载新图像或更新图像时重新缩放,但不在更新描述时重新缩放。
解决方案 1:
一些想法:
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)
不确定它是否可以与所有伪自动 django 工具很好地兼容(例如:ModelForm、contrib.admin 等)。
解决方案 2:
检查模型的 pk 字段。如果为 None,则它是一个新对象。
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)
编辑:我在 form.changed_data 中添加了对“image”的检查。这假设您正在使用管理站点来更新图像。您还必须覆盖默认的 save_model 方法,如下所示。
class ModelAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.save(form=form)
解决方案 3:
您可以提供额外的参数来确认新图片已发布。
例如:
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
解决方案 4:
在数据库中查询具有相同 PK 的现有记录。比较新图像和现有图像的文件大小和校验和,看它们是否相同。
解决方案 5:
我为了实现目标所做的事情就是做到这一点......
# 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"
或更正式的文本替换。
希望这个能有帮助!
解决方案 6:
在新版本中它是这样的:
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
解决方案 7:
我找到了另一种将数据存储到数据库的简单方法
模型.py
class LinkModel(models.Model):
link = models.CharField(max_length=500)
shortLink = models.CharField(max_length=30,unique=True)
在数据库中只有 2 个变量
视图.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 个变量中。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD