achievement.management.commands.upload_achievements 源代码
"""
excel 上传成就
"""
from django.core.management.base import BaseCommand
import pandas as pd
from achievement.models import Achievement
from achievement.utils import bulk_add_achievement_record
from generic.models import User
[文档]
class Command(BaseCommand):
"""
从excel中导入成就 格式:学号 成就
filepath: excel文件路径
"""
help = "upload achievements from excel"
[文档]
def add_arguments(self, parser):
parser.add_argument('filepath', type=str)
[文档]
def handle(self, *args, **options):
# 读取 excel
filepath = options['filepath']
full_path = filepath
data = None
if filepath.endswith('xlsx') or filepath.endswith('xls'):
data = pd.read_excel(f'{full_path}', sheet_name=None)
elif filepath.endswith('csv'):
data = pd.read_csv(f'{full_path}', dtype=object, encoding='utf-8')
else:
data = pd.read_table(f'{full_path}', dtype=object, encoding='utf-8')
if data == None:
print('文件格式不正确')
return
# 默认选取第一个sheet
if type(data) == dict:
data = data[list(data.keys())[0]]
data['学号'] = data['学号'].astype(str)
# 应用api接口分类批量上传成就
grouped = data.groupby('成就')
for achievement_name, achievement_data in grouped:
user_number_list = list(set(achievement_data['学号'].values))
user_list = User.objects.filter(username__in=user_number_list)
bulk_add_achievement_record(user_list, Achievement.objects.get(name=achievement_name))