from django.core.management.base import BaseCommand from contest.models import Contest, ContestQuestion, Question, QuestionVersion QUESTIONS = { Question.Track.BEGINNER: [ ("b-12-plus-19", "12 + 19", "31"), ("b-8-times-7", "8 × 7", "56"), ("b-90-minus-37", "90 - 37", "53"), ("b-144-div-12", "144 ÷ 12", "12"), ("b-25-times-4", "25 × 4", "100"), ], Question.Track.STANDARD: [ ("s-17-times-23", "17 × 23", "391"), ("s-625-div-25", "625 ÷ 25", "25"), ("s-48-times-15", "48 × 15", "720"), ("s-1000-minus-387", "1000 - 387", "613"), ("s-35-squared", "35²", "1225"), ], Question.Track.ADVANCED: [ ("a-mod-2pow10", "2¹⁰ 除以 7 的余数", "2"), ("a-sum-1-50", "1 到 50 的整数和", "1275"), ("a-15-choose-2", "C(15,2)", "105"), ("a-sqrt-2025", "√2025", "45"), ("a-3pow6", "3⁶", "729"), ], } class Command(BaseCommand): help = "创建首批分层题目、实时 1v1、每日赛和单人练习" def handle(self, *args, **options): versions = {} for track, questions in QUESTIONS.items(): versions[track] = [] for slug, prompt, answer in questions: question, _ = Question.objects.update_or_create( slug=slug, defaults={"track": track, "tags": ["口算"], "is_active": True}, ) version, _ = QuestionVersion.objects.update_or_create( question=question, version=1, defaults={ "prompt": prompt, "answer": answer, "explanation": f"答案为 {answer}", }, ) versions[track].append(version) contest_specs = [] for track, label in ( (Question.Track.BEGINNER, "入门"), (Question.Track.STANDARD, "标准"), (Question.Track.ADVANCED, "进阶"), ): contest_specs.extend( [ ( f"realtime-{track}", f"{label}实时 1v1", Contest.Kind.REALTIME, track, 60, ), ( f"daily-{track}", f"{label}今日挑战", Contest.Kind.DAILY, track, 180, ), ( f"practice-{track}", f"{label}单人闯关", Contest.Kind.PRACTICE, track, 300, ), ] ) for slug, title, kind, track, duration in contest_specs: contest, _ = Contest.objects.update_or_create( slug=slug, defaults={ "title": title, "kind": kind, "track": track, "duration_seconds": duration, "status": Contest.Status.PUBLISHED, }, ) ContestQuestion.objects.filter(contest=contest).delete() ContestQuestion.objects.bulk_create( [ ContestQuestion( contest=contest, question_version=version, order=index, points=100, ) for index, version in enumerate(versions[track], start=1) ] ) self.stdout.write( self.style.SUCCESS( f"已创建 {sum(map(len, QUESTIONS.values()))} 道题和 {len(contest_specs)} 场比赛" ) )