import os from django.core.management.base import BaseCommand from media.models import Photo from django.db import transaction class Command(BaseCommand): help = "Fix photo paths in database to match actual file locations" def handle(self, *args, **kwargs): self.stdout.write("Fixing photo paths in database...") # Get all photos photos = Photo.objects.all() for photo in photos: try: with transaction.atomic(): # Get current file path current_name = photo.image.name # Remove any 'media/' prefix if it exists if current_name.startswith("media/"): # Remove 'media/' prefix current_name = current_name[6:] parts = current_name.split("/") if len(parts) >= 2: content_type = parts[0] # 'park' or 'ride' identifier = parts[1] # e.g., 'alton-towers' # Look for files in the media directory media_dir = os.path.join("media", content_type, identifier) if os.path.exists(media_dir): files = [ f for f in os.listdir(media_dir) if not f.startswith(".") # Skip hidden files and not f.startswith("tmp") # Skip temp files and os.path.isfile(os.path.join(media_dir, f)) ] if files: # Get the first file and update the database # record file_path = os.path.join( content_type, identifier, files[0] ) if os.path.exists(os.path.join("media", file_path)): photo.image.name = file_path photo.save() self.stdout.write( f"Updated path for photo { photo.id} to {file_path}" ) else: self.stdout.write( f"File not found for photo { photo.id}: {file_path}" ) else: self.stdout.write( f"No files found in directory for photo { photo.id}: {media_dir}" ) else: self.stdout.write( f"Directory not found for photo { photo.id}: {media_dir}" ) except Exception as e: self.stdout.write(f"Error updating photo {photo.id}: {str(e)}") continue self.stdout.write("Finished fixing photo paths")