Models
Models
models.pyはアプリケーション内で用いられるデータを定義しているものです.以下の3つからなります.
Subsession
Group
Player
1人のPlayerはグループの構成要員であり,subsessionの一部です.詳細は"Conceptual overview"でご確認ください.
Model fields
models.pyの主な定義は,データベース上における列を定義するものです.以下のような表を作ってみましょう.
name
age
is_student
John
30
False
Alice
22
True
Bob
35
False
...
このようなテーブル構造は,以下のように定義することができます.
class Player(BasePlayer):
...
name = models.CharField()
age = models.PositiveIntegerField()
is_student = models.BooleanField()otree resetdbを実行した時,models.pyを分析して,その通りにデータベーステーブルを作成します.(だから,models.pyに追加したり,削除したり,項目に変更を加えた際にresetdbを実行する必要があります.)
利用可能なfieldsのリストはDjangoドキュメンテーションのココにあります.最もよく使われるのはCharField/TextField(文字列),FloatField(実数),BooleanField(真偽値),IntegerFieldとPositiveIntegerFieldです.FloatFieldとDecimalFieldの違いを十分に理解しない限り,そして使う必要がない限りは使わないようにしてください.
さらに,oTreeはCurrencyFieldがあります.詳細はお金と利得を御覧ください.
Settng a field's initial/default value
あなたが定義したどんなフィールドも,初期値はNoneであり,何も定義されていません.もし,何らかの初期値を定義したいのであれば,initial =を使ってください.
class Player(BasePlayer):
some_number = models.IntegerField(initial=0)min, max. choices
min(最小値),max(最大値)やchoices(選択肢)を設定したいのであれば,コチラをごらんください.
Constants
Constantsクラスは,プレイヤーに共通するアプリケーションのパラメータと定数を設定するのに適したものです.
以下がアプリケーションに必要となる定数です.
name_in_url:この名前は実験参加者のURLにおいて,アプリケーションを特定するために用いられます.例えば,public_goodsを設定したのであれば,実験参加者のURLは以下のようになります.http://otree-demo.herokuapp.com/p/zuzepona/public_goods/Introduction/1/players_per_group:(Groupsの欄で述べます.)num_rounds:(Roundsの欄で述べます.)
Subsession
以下には,Subsessionオブジェクトの属性とメソッドのリストを示します.
session
sessionの中にはsubsessionがあります.詳細は"Self"に関する説明を確認してください.
round_number
現在のラウンド数を表示します.ただし,これは複数ラウンド実施するゲーム実験のみに関係します.(Constants.num_roundsで定義されます.)詳細は"Rounds"に関する説明を確認してください.
before_session_starts
before_session_startsはcreating_sessionからotree-core1.3.2(June 2017)より変更したものです.しかしながら,before_session_startsも下位互換性を保つために,現在でも利用可能です.
creating_session
このメソッドは
before_session_startsと呼ばれていたものです.詳細はそちらをご確認ください.
このメソッドは管理者が"create session"をクリックした際に実行されます.
creating_sessionはplayer,Groups,subsessionsなどのフィールドを初期値に戻すものです.例は以下のとおりです.
class Subsession(BaseSubsession):
def creating_session(self):
for p in self.get_players():
p.some_field = some_value詳細ない情報はtreatmentsとgroup shufflingにあります.
もし,アプリケーションが1ラウンドだけであれば,creating_sessionは一度だけ実行されます.もし,アプリケーションがNラウンドあれば,N回実行されます.すなわち,各subsessionに1つずつ必要となるのです.
この方法は各ラウンドの始まりには実行されます.そのために,ページの進行を止めるためには
after_all_players_arrive()を使ってください.
group_randomly()
Group matchingを確認してください.
group_like_round()
Group matchingを確認してください.
get_group_matrix()
Group matchingを確認してください.
get_groups()
subsessionにおける全てのグループのリストを返します.
get_players()
subsessionにおける全てのプレイヤーのリストを返します.
in_previous_rounds()
詳細はPassing data between rounds or appsを確認してください.
in_all_rounds()
詳細はPassing data between rounds or appsを確認してください.
in_round(round_number)
詳細はPassing data between rounds or appsを確認してください.
in_rounds(self, first, last)
詳細はPassing data between rounds or appsを確認してください.
Group
以下には,Groupオブジェクトの属性とメソッドのリストを示します.
sessions/subsession
sessionの中にはsubsessionがあります.詳細は"Self"に関する説明を確認してください.
get_players()
Groupsを確認してください.
get_player_by_role(role)
Groupsを確認してください.
get_player_by_id(id_in_group)
Groupsを確認してください.
set_players(players_list)
Group matchingを確認してください.
in_previous_rounds()
詳細はPassing data between rounds or appsを確認してください.
in_all_rounds()
詳細はPassing data between rounds or appsを確認してください.
in_round(round_number)
詳細はPassing data between rounds or appsを確認してください.
in_rounds(self, first, last)
詳細はPassing data between rounds or appsを確認してください.
Player
以下には,Playerオブジェクトの属性とメソッドのリストを示します.
id_in_group
整数であり,1から始まります.複数人ゲームの場合,この数値はプレイヤー1に割り振られているのか,プレイヤー2に割り振られているのかなどを示します.
payoff
プレイヤーのそのラウンドにおける利得を示します.詳細はpayoffsを確認してください.
session/subsession/group/participant
get_others_in_group()
Groupsを確認してください.
get_others_in_subsession()
Groupsを確認してください.
role()
in_previous_rounds()
詳細はPassing data between rounds or appsを確認してください.
in_all_rounds()
詳細はPassing data between rounds or appsを確認してください.
in_round(round_number)
詳細はPassing data between rounds or appsを確認してください.
in_rounds(self, first, last)
詳細はPassing data between rounds or appsを確認してください.
Session
num_participants
そのセッションの参加者の人数を示しています.
config
Configure sessionsとChoosing which treatment to playを確認してください.
vars
session.varsを確認してください.
Participant
vars
participants.varsを確認してください.
label
participants.labelsを確認してください.
id_in_session
セッションにおける実験参加者のIDを示しています.このIDはプレイヤーのid_in_subsessionと同じものです.
payoff
payoffsを確認してください.
payoff_plus_participation_fee
payoffsを確認してください.
oTreeコードの実行方法
メソッド内にないコードは基本的には全てglobalであり,サーバ起動時に一度だけ実行されます.
一部の人々は新しいセッションが実行される度にコードが実行されると勘違いしているようです.例えば,コイントスで表が出るようなランダム確率を発生させたい人は以下のようなコードをmodels.pyに書くかもしれません.
class Constants(BaseConstants):
heads_probability = random.random() # wrongサーバが起動した時にmodels.pyを起動します.そしてrandom.random()を一度だけ実行します.そしてランダムな数字,例えば“0.257291”を評価します.
class Constants(BaseConstants):
heads_probability = 0.257291なぜならば,Constantsはglobal変数であり,“0.257291”が全てのセッションにおいて全プレイヤーに共有されます.
同じ理由で,以下のコードも起動しません.
class Player(BasePlayer):
heads_probability = models.FloatField(
# wrong
initial=random.random()
)この解決策は,creating_sessionのように,メソッドの内部でランダム変数を発生させることです.
Last updated
Was this helpful?