dm.management.commands.autograduate 源代码

from django.core.management.base import BaseCommand, CommandParser, CommandError
from django.db import transaction

from app.models import (
    NaturalPerson,
    User
)

status_map = {
    0: '在读',
    1: '住宿辅导员',
    2: '延毕',
    3: '休学',
    4: '已毕业'
}

[文档] class Command(BaseCommand): help = '通过学号批量调整指定年级的学生状态为“已毕业”'
[文档] def add_arguments(self, parser: CommandParser): parser.add_argument( '--year', type=int, help='指定年级,以两位方式填写(例如20)', required=True )
[文档] def handle(self, *args, **options): year = options['year'] cnt = 0 cnt_map = {k:0 for k in status_map.keys()} for person in NaturalPerson.objects.filter(person_id__username__startswith=str(year), identity = NaturalPerson.Identity.STUDENT): cnt_map[person.status] += 1 self.stdout.write(self.style.WARNING('学号%s的学生状态: %s => 已毕业' % (person.person_id.username, status_map[person.status]))) cnt += 1 self.stdout.write(self.style.WARNING('=> 共处理学生%d人' % cnt)) detail_str = "将要将" for k, v in cnt_map.items(): if v > 0: detail_str += " %s %d人," % (status_map[k], v) detail_str = detail_str.rstrip(',') + '的状态调整为“已毕业”' self.stdout.write(self.style.WARNING(detail_str)) self.stdout.write(self.style.WARNING('如需保留某些学生,请稍后再用updategraduatestatus命令调整其状态')) self.stdout.write(self.style.WARNING('请确认无误后,输入y以继续,n以取消')) confirm = input() if confirm.lower() != 'y': self.stdout.write(self.style.ERROR('操作已取消')) return with transaction.atomic(): # 选出指定年级的自然人(通过学号前两位判断,person_id为学号) NaturalPerson.objects.filter( person_id__username__startswith=str(year), identity = NaturalPerson.Identity.STUDENT).update( status = NaturalPerson.GraduateStatus.GRADUATED, accept_promote = False) User.objects.filter( username__startswith=str(year), utype = User.Type.STUDENT).update(active = False) # 打印结果 self.stdout.write(self.style.SUCCESS('成功将%d级学生状态调整为“已毕业”' % year))