Die Verwendung von post_delete ist mit Sicherheit der richtige Weg. Manchmal kann es jedoch zu Fehlern kommen und Dateien werden nicht gelöscht. Es gibt natürlich den Fall, dass Sie eine Reihe alter Dateien haben, die nicht gelöscht wurden, bevor post_delete verwendet wurde. Ich habe eine Funktion erstellt, die Dateien für Objekte basierend darauf löscht, ob die Datei, auf die das Objekt verweist, nicht vorhanden ist, dann Objekt löschen, wenn die Datei kein Objekt hat, dann auch löschen, kann sie auch basierend auf einem "aktiven" Flag für ein löschen Objekt .. Etwas, das ich den meisten meiner Modelle hinzugefügt habe. Sie müssen ihm die Objekte übergeben, die Sie überprüfen möchten, den Pfad zu den Objektdateien, das Dateifeld und ein Flag, um inaktive Objekte zu löschen:
def cleanup_model_objects(m_objects, model_path, file_field='image', clear_inactive=False):
# PART 1 ------------------------- INVALID OBJECTS
#Creates photo_file list based on photo path, takes all files there
model_path_list = os.listdir(model_path)
#Gets photo image path for each photo object
model_files = list()
invalid_files = list()
valid_files = list()
for obj in m_objects:
exec("f = ntpath.basename(obj." + file_field + ".path)") # select the appropriate file/image field
model_files.append(f) # Checks for valid and invalid objects (using file path)
if f not in model_path_list:
invalid_files.append(f)
obj.delete()
else:
valid_files.append(f)
print "Total objects", len(model_files)
print "Valid objects:", len(valid_files)
print "Objects without file deleted:", len(invalid_files)
# PART 2 ------------------------- INVALID FILES
print "Files in model file path:", len(model_path_list)
#Checks for valid and invalid files
invalid_files = list()
valid_files = list()
for f in model_path_list:
if f not in model_files:
invalid_files.append(f)
else:
valid_files.append(f)
print "Valid files:", len(valid_files)
print "Files without model object to delete:", len(invalid_files)
for f in invalid_files:
os.unlink(os.path.join(model_path, f))
# PART 3 ------------------------- INACTIVE PHOTOS
if clear_inactive:
#inactive_photos = Photo.objects.filter(active=False)
inactive_objects = m_objects.filter(active=False)
print "Inactive Objects to Delete:", inactive_objects.count()
for obj in inactive_objects:
obj.delete()
print "Done cleaning model."
So können Sie Folgendes verwenden:
photos = Photo.objects.all()
photos_path, tail = ntpath.split(photos[0].image.path) # Gets dir of photos path, this may be different for you
print "Photos -------------->"
cleanup_model_objects(photos, photos_path, file_field='image', clear_inactive=False) # image file is default