Ты можешь у ImageField (также, как и FileField) переопределить поле upload_to и присвоить ему функцию, принимающую два аргумента - обект модели и имя файла. У тебя получится что-то вроде этого:
import os
from django.conf import settings
def get_image_path(instance, filename):
# Но так никогда нельзя делать!
return os.path.join('images', str(instance.pk), filename)
А вот так будет лучше:
import os
from uuid import uuid1
def get_image_path(instance, filename):
result = os.path.join('images', str(instance.pk), uuid1().hex)
if '.' in filename:
result = os.path.join(result, filename.split('.')[-1])
return result