python Django只在某些情况下覆盖为模型保存?

osh3o9ms  于 2023-03-11  发布在  Python
关注(0)|答案(7)|浏览(233)

在保存模型之前,我会重新调整图片的大小。但是我如何检查是否添加了新图片或只是更新了描述,这样我就可以在每次保存模型时跳过重新缩放?

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)

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

uqzxnwby

uqzxnwby1#

一些想法:

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工具配合使用(例如:模型表单、贡献管理等)。

ltqd579y

ltqd579y2#

检查模型的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)

编辑:我在表单.changed_data中添加了对“image”的检查。这假设您正在使用管理站点来更新您的图像。您还必须覆盖默认的保存_model方法,如下所示。

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

oknwwptz3#

你可以提供额外的参数来确认一个新的图像被张贴。
比如:

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
kqlmhetl

kqlmhetl4#

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

yvt65v4c

yvt65v4c5#

我为实现目标所做的就是...

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

在保存()方法下面是..

# 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"或更正式的文本。
希望这一个有帮助!

2wnc66cl

2wnc66cl6#

在新版本中是这样的:

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
ttvkxqim

ttvkxqim7#

我已经找到了另一种简单的方法来将数据存储到数据库中
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

在此,我仅在www.example.com中创建了模型示例views.py,并仅从视图中将数据放入/保存到2个变量中。

相关问题