You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:05:19