[python] 장고. 모델에 대한 저장 무시
모델을 저장하기 전에 사진 크기를 조정하고 있습니다. 그러나 새 사진이 추가되었거나 설명이 업데이트되었는지 어떻게 확인할 수 있습니까? 모델이 저장 될 때마다 크기 조정을 건너 뛸 수 있습니까?
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)
새 이미지가로드되거나 이미지가 업데이트 된 경우에만 크기를 조정하고 싶지만 설명이 업데이트되지 않았습니다.
답변
몇 가지 생각 :
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, contrib.admin 등)에서 잘 작동하는지 확실하지 않습니다.
답변
모델의 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)
답변
새 이미지가 게시되었음을 확인하기 위해 추가 인수를 제공 할 수 있습니다.
다음과 같은 것 :
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를 가진 기존 레코드에 대해 데이터베이스를 조회하십시오. 새 이미지와 기존 이미지의 파일 크기와 체크섬을 비교하여 동일한 지 확인하십시오.
답변
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def save(self, *args, **kwargs):
do_something()
super().save(*args, **kwargs) # Call the "real" save() method.
do_something_else()
super().save(*args, **kwargs)
객체가 여전히 데이터베이스에 저장되도록 하려면 수퍼 클래스 메소드 (즉, 비즈니스) 를 호출하는 것이 중요
합니다. 수퍼 클래스 메소드 호출을 잊어 버린 경우 기본 동작이 발생하지 않고 데이터베이스가 건드리지 않습니다.
답변
새 버전에서는 다음과 같습니다.
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