在Otree中如何获取custom_export导出的数据?导出异常求助
问题描述
尝试用ExtraModel和custom_export从live页面导出数据,但devserver的数据标签页里找不到这些数据,下载页面右下角的默认Excel文件时,ExtraModel里的新变量也没包含进去。想问custom_export导出的数据存在哪里?是不是我定义custom_export函数的方式错了?
最小可复现代码
from otree.api import * import random doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'mwe_export' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 NUM_EMPLOYERS = 3 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): pass class Offer(ExtraModel): group = models.Link(Group) sender = models.Link(Player) wage = models.IntegerField() effort = models.IntegerField() job_id = models.IntegerField() information_type = models.StringField() # FUNCTIONS def to_dict(offer: Offer): return dict(sender=offer.sender.id_in_group, wage=offer.wage, effort=offer.effort, job_id=offer.job_id, information_type=information_type) # PAGES class MyPage(Page): @staticmethod def js_vars(player: Player): return dict(my_id=player.id_in_group) @staticmethod def live_method(player: Player, data): print(data) group = player.group job_id = random.randint(1, 1000) wage = data['wage'] effort = data['effort'] information_type = data['information_type'] if data['information_type'] == 'offer': offer = Offer.create(group=group, sender=player, job_id=job_id, wage=wage, effort=effort, information_type=information_type) print(offer) print(to_dict(offer)) return {0: to_dict(offer)} page_sequence = [MyPage] def custom_export(players): yield ['session.code', 'participant_code', 'id_in_session'] offers = Offer.filter() for offer in offers: player = offer.sender participant = player.participant yield [participant.code, participant.id_in_session, offer.job_id, offer.wage, offer.effort]
问题解答
1. custom_export导出数据的获取位置
custom_export的结果不会出现在默认的Excel下载里,默认下载只包含Player、Group、Subsession模型的数据。你需要在devserver的数据页面往下翻,找到Custom exports区域,这里会显示你定义的custom_export函数对应的下载链接,点击这个链接才能拿到包含ExtraModel数据的文件。
2. 你的custom_export函数存在的错误
- 表头与数据列数不匹配:第一行yield的表头是3列,但后续循环里yield的是5列,这会导致导出文件格式错误,oTree可能不会正常显示这个导出选项。需要把表头和数据列数对应上,比如修改表头为:
yield ['participant_code', 'id_in_session', 'job_id', 'wage', 'effort'] - 表头与数据对应关系错误:原表头里的
session.code在后续数据里没有对应值,你实际输出的是participant.code,要么修正表头,要么在数据里加上participant.session.code。 - 另外,
to_dict函数里有个小错误:information_type=information_type应该改成information_type=offer.information_type,否则会抛出变量未定义的错误,不过这个不影响导出,但会导致live_method返回的响应出错。
内容的提问来源于stack exchange,提问作者Papayapap
相关产品推荐
相关产品推荐

