Models
models.py
はアプリケーション内で用いられるデータを定義しているものです.以下の3つからなります.- Subsession
- Group
- Player
1人のPlayerはグループの構成要員であり,subsessionの一部です.詳細は"Conceptual overview"でご確認ください.
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
の違いを十分に理解しない限り,そして使う必要がない限りは使わないようにしてください.あなたが定義したどんなフィールドも,初期値は
None
であり,何も定義されていません.もし,何らかの初期値を定義したいのであれば,initial =
を使ってください.class Player(BasePlayer):
some_number = models.IntegerField(initial=0)
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
オブ ジェクトの属性とメソッドのリストを示します.session
の中にはsubsession
があります.詳細は"Self"に関する説明を確認してください.現在のラウンド数を表示します.ただし,これは複数ラウンド実施するゲーム実験のみに関係します.(Constants.num_roundsで定義されます.)詳細は"Rounds"に関する説明を確認してください.
before_session_starts
はcreating_session
からotree-core1.3.2(June 2017)より変更したものです.しかしながら,before_session_starts
も下位互換性を保つために,現在でも利用可能です.このメソッドは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
もし,アプリケーションが1ラウンドだけであれば,
creating_session
は一度だけ実行されます.もし,アプリケーションがNラウンドあれば,N回実行されます.すなわち,各subsessionに1つずつ必要となるのです.subsessionにお ける全てのグループのリストを返します.
subsessionにおける全てのプレイヤーのリストを返します.
以下には,
Group
オブジェクトの属性とメソッドのリストを示します.session
の中にはsubsession
があります.詳細は"Self"に関する説明を確認してください.以下には,
Player
オブジェクトの属性とメソッドのリストを示します.整数であり,1から始まります.複数人ゲームの場合,この数値はプレイヤー1に割り振られているのか,プレイヤー2に割り振られているのかなどを示します.
そのセッションの参加者の人数を示しています.
セッションにおける実験参加者のIDを示しています.このIDはプレイヤーの
id_in_subsession
と同じものです.メソッド内にないコードは基本的には全て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()
)
Last modified 4yr ago