如何在 Django 中重写模型

在保存模型之前,我重新调整图片的大小。但是我怎样才能检查新的图片添加或只是描述更新,所以我可以跳过重新缩放每次模型保存?

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)

我想重新缩放只有当新的图像加载或图像更新,但不当描述更新。

267673 次浏览

查询具有相同 PK 的现有记录的数据库。比较新图像和现有图像的文件大小和校验和,看看它们是否相同。

您可以提供额外的参数,以确认一个新的图像发布。
比如:

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

一些想法:

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 等)。

检查模型的 pk 字段。如果它是 Nothing,那么它是一个新对象。

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.change _ data 中的“ image”添加了一个检查。这假设您正在使用管理站点来更新您的图像。您还必须重写如下所示的默认 save _ model 方法。

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

我为了实现这个目标所做的就是。

# 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")

您可以用 "im just editing the description"或更正式的文本替换 "skip creating photo thumbnail"

希望这个能帮上忙!

新版本是这样的:

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个变量

视野,视野

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 中创建了 model 的实例,并且只从视图中将数据放入/保存到2个变量中。