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(真偽値),IntegerFieldPositiveIntegerFieldです.FloatFieldDecimalFieldの違いを十分に理解しない限り,そして使う必要がない限りは使わないようにしてください.

さらに,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_startscreating_sessionからotree-core1.3.2(June 2017)より変更したものです.しかしながら,before_session_startsも下位互換性を保つために,現在でも利用可能です.

creating_session

このメソッドはbefore_session_startsと呼ばれていたものです.詳細はそちらをご確認ください.

このメソッドは管理者が"create session"をクリックした際に実行されます.

creating_sessionplayerGroupssubsessionsなどのフィールドを初期値に戻すものです.例は以下のとおりです.

class Subsession(BaseSubsession):
def creating_session(self):
for p in self.get_players():
p.some_field = some_value

詳細ない情報はtreatmentsgroup 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 sessionsChoosing 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のように,メソッドの内部でランダム変数を発生させることです.