일부 경우에만 모델에 대한 장고 오버라이드 저장?
모델을 저장하기 전에 사진 크기를 조정합니다.하지만 모델이 저장될 때마다 크기 조정을 건너뛸 수 있도록 새 사진이 추가되었는지 또는 설명만 업데이트되었는지 확인하려면 어떻게 해야 합니까?
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, contribute.admin 등)에서 제대로 작동할지 확신할 수 없습니다.
모델의 pk 필드를 확인합니다.없음이면 새 개체입니다.
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
PK가 동일한 기존 레코드에 대해 데이터베이스를 쿼리합니다.새 이미지와 기존 이미지의 파일 크기와 체크섬을 비교하여 동일한지 확인합니다.
목표를 달성하기 위해 제가 한 일은 이것을 만드는 것이었습니다.
# 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"
또는 좀 더 형식적인 텍스트.
이것이 도움이 되길 바랍니다!
새 버전에서는 다음과 같습니다.
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개뿐입니다.
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
여기서 저는 views.py 에서만 모델의 인스턴스를 생성하고 뷰에서만 데이터를 2개의 변수에 저장했습니다.
언급URL : https://stackoverflow.com/questions/4269605/django-override-save-for-model-only-in-some-cases
'programing' 카테고리의 다른 글
개체 'sysobjects', 데이터베이스 'mssqlssystem resource', 스키마 'sys'에 대한 SELECT 권한이 거부되었습니다. (0) | 2023.07.13 |
---|---|
Oracle 삭제 쿼리에 시간이 너무 많이 걸림 (0) | 2023.07.13 |
플라스크의 컨텍스트 스택의 목적은 무엇입니까? (0) | 2023.07.13 |
NOT와 AND를 함께 사용하는 MongoDB (0) | 2023.07.13 |
Apache POI를 사용하여 Excel 차트 생성 (0) | 2023.07.13 |