from django.core.management.base import BaseCommand from django.db import transaction from apps.quiz.models import Quiz, Question, QuizParticipant, ParticipantAnswer class Command(BaseCommand): help = 'Clear all quiz-related data from the database' def add_arguments(self, parser): parser.add_argument( '--confirm', action='store_true', help='Confirm that you want to delete all quiz data', ) def handle(self, *args, **options): if not options['confirm']: self.stdout.write( self.style.WARNING( 'This command will delete ALL quiz-related data from the database!\n' 'This includes:\n' '- All Quizzes\n' '- All Questions\n' '- All Quiz Participants\n' '- All Participant Answers\n\n' 'Use --confirm flag to proceed with deletion.\n' 'Example: python manage.py clear_quiz_data --confirm' ) ) return try: with transaction.atomic(): # Count records before deletion participant_answers_count = ParticipantAnswer.objects.count() quiz_participants_count = QuizParticipant.objects.count() questions_count = Question.objects.count() quizzes_count = Quiz.objects.count() self.stdout.write( f'Found {participant_answers_count} participant answers, ' f'{quiz_participants_count} quiz participants, ' f'{questions_count} questions, and ' f'{quizzes_count} quizzes.' ) # Delete in order to respect foreign key constraints # ParticipantAnswer -> QuizParticipant -> Quiz # Question -> Quiz self.stdout.write('Deleting participant answers...') ParticipantAnswer.objects.all().delete() self.stdout.write('Deleting quiz participants...') QuizParticipant.objects.all().delete() self.stdout.write('Deleting questions...') Question.objects.all().delete() self.stdout.write('Deleting quizzes...') Quiz.objects.all().delete() self.stdout.write( self.style.SUCCESS( f'Successfully deleted all quiz data:\n' f'- {participant_answers_count} participant answers\n' f'- {quiz_participants_count} quiz participants\n' f'- {questions_count} questions\n' f'- {quizzes_count} quizzes' ) ) except Exception as e: self.stdout.write( self.style.ERROR(f'Error occurred while clearing quiz data: {str(e)}') ) raise