Я использую Django_rest Framework для загрузки файлов на мой сайт.Однако часто я загружаю один и тот же файл, поэтому я хочу избежать загрузки одного и того же файла несколько раз.
Чтобы избежать сохранения нескольких копий одного и того же файла, я переписал модель сохранения, чтобы загрузить файл и удалить файл, если он уже существует.Это работает, хотя я чувствую, что это много ненужной загрузки.Тем не менее, я не могу получить существующий идентификатор для возврата из моего сериализатора, чтобы не делать этого.Есть ли лучшее решение для этого?
Model.py
class IMAGES(models.Model):
IMAGE = models.FileField(max_length=150,upload_to='documents/%Y/%m/%d')
def __unicode__(self):
return str(self.id)
def save(self, *args, **kwargs):
imstring="documents/" + datetime.now().strftime('%Y') + "/" + datetime.now().strftime('%m') + "/" + datetime.now().strftime('%d') + "/" + str(self.IMAGE)
try:
this = IMAGES.objects.filter(IMAGE=imstring)[0] # This sees if the filename is already in the database.
if this.IMAGE: # if it is,
# delete the file and replace it.
os.remove(this.IMAGE.path)
except IndexError:
pass
except ObjectDoesNotExist:
pass
super(IMAGES, self).save(*args, **kwargs)
serializer.py
class IMAGESEntrySerializer(serializers.ModelSerializer):
class Meta:
model = IMAGES
fields = (
'id', 'IMAGE')
def create(self, validated_data):
result, other = IMAGES.objects.get_or_create(**validated_data)
return result
def update(self, instance, validated_data):
"""
Update and return an existing `Snippet` instance, given the validated data.
"""
instance.NAME = validated_data.get('NAME', instance.title)
instance.save()
return instance
views.py
class IMAGESADD(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = IMAGES.objects.all()
serializer_class = IMAGESEntrySerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)