Do Not Save Model On Duplicate File - Django 2
I am trying to check for an existing file and overwriting it, so far I am able to do it using a custom storage, which looks something like this from django.core.files.storage impor
Solution 1:
The condition, if instance.relative_path != 'null':
is wrong. It should be just if instance.relative_path:
When I tried your snippet I felt something wrong with the user_directory_path
function. So, I changed it to something like below.
def user_directory_path(instance, filename):
"""
If relative path is not ``null`` the files will be stored as is else it will be
stored to the root directory.
The "relative_path" path should not be start or ends with a slash ("/") but, can use slash inside
/foo/ -> Not allowed
/foo/bar -> Not allowed
foo/bar/ -> Not allowed
foo -> Allowed
foo/bar -> Allowed
foo/bar/foobar -> Allowed
"""
if instance.relative_path:
relative_path = instance.relative_path
if relative_path[0] == '/':
relative_path = relative_path[1:]
if relative_path[:-1] == '/':
relative_path = relative_path[:-1]
return 'user_{0}/{1}/{2}'.format(instance.user.id, relative_path, filename)
return 'user_{0}/{1}'.format(instance.user.id, filename)
Now coming to our solution, I've created a sample view which will solve the issue.
from django.http.response import HttpResponse
def foo(request):
if request.method == 'POST':
create_data = {
"user_id": request.user.pk,
"file": request.FILES['file_name']
}
ds_temp = DataStorageModel(**create_data)
path = user_directory_path(ds_temp, ds_temp.file.name)
try:
ds_existing = DataStorageModel.objects.get(file=path)
ds_existing.file = create_data['file']
ds_existing.save()
return HttpResponse("instance modified")
except DataStorageModel.DoesNotExist:
ds_temp.save()
return HttpResponse("new instance created")
return HttpResponse("HTTP GET method")
Post a Comment for "Do Not Save Model On Duplicate File - Django 2"