definable-serializerではシリアライザーを記述するためのフィールドと、 ユーザーからの入力データを保存するためのフィールドを提供しています。
definable-serializerでは、JSON/YAMLで記述された文字列及びファイルからシリアライザーを作ることができます。 特にadminサイトでシリアライザーの定義を記述することで、デプロイの手間を無くすのが目的です。 adminサイト上でテキストデータの編集を行うのは難しい話ではないものの、YAMLやJSONをコードハイライト無しで記述するのはちょっとした苦行です。
この問題を解決するために、CodeMirror2ウィジェットを組み込んだシリアライザー定義用のフィールドを用意しています。
DefinableSerializerByYAMLFieldは https://github.com/datadesk/django-yamlfield が 提供するYAMLFieldをラップし、CodeMirror2ウィジェットの利用及び非ASCII文字が正しく表示できるようにカスタマイズしています。
allow_validate_method
が False
の場合、シリアライザーの定義中に validate_method
が記述されていると ValidationError
が発生します。
その他のオプションについては https://github.com/datadesk/django-yamlfield を参照してください。
以下に記述例を示します。
class Survey(models.Model):
..
question = DefinableSerializerByYAMLField()
DefinableSerializerByJSONFieldは https://github.com/dmkoch/django-jsonfield が 提供するJSONFieldをラップし、CodeMirror2ウィジェットの利用及び非ASCII文字が正しく表示できるようにカスタマイズしています。
allow_validate_method
が False
の場合、シリアライザーの定義中に validate_method
が記述されていると ValidationError
が発生します。
その他のオプションについては https://github.com/dmkoch/django-jsonfield を参照してください。
以下に記述例を示します。
class Survey(models.Model):
..
question = DefinableSerializerByJSONField()
storing-input-data
でも取り上げたように、モデルに結びつかないシリアライザーの持つユーザーからの入力データを永続的に保存するには、 保存を担うモデルクラスのフィールドにシリアライズ(直列化)された状態でデータを保存します。
ようはPythonのネイティブなデータをテキストやバイナリに変換してデータベースのカラム、即ちモデルフィールドに保存できればどんな形でも構いません。
definable-serializerではユーザーからの入力を保存するために2つのモデルフィールドを用意しています。
JSONは人気の高いシリアライズの形式です。しかし、Pythonに付属するjsonモジュールはPythonのネイティブなデータ型である set型
をシリアライズすることができません。
またensure_asciiの設定を行わないと非ASCII文字を "\uXXXX" で表してしまうため、入力情報を確認する際に見苦しい状態になります。
definable-serializerでは、 jsonfield が提供するJSONFieldをラップし、 これらの問題を解消するコンパチビリティクラスを提供しています。
以下に使用例を示します。
from definable_serializer.models.compat import JSONField as CompatJSONField
class Answer(models.Model):
..
answer = CompatJSONField(
verbose_name="answer data",
help_text="answer data"
)
このモデルフィールドを使うとadmin画面で以下のように表示されます。
非ASCII文字列が正しく表示されますYAMLはJSONと同様、テキストでデータをシリアライズします。記号が少なくインデントでデータ構造を表すため、Pythonのコードのように可読性に優れます。
definable-serializerでは、 django-yamlfield (https://github.com/datadesk/django-yamlfield) が提供するYAMLFieldをラップし、非ASCII文字が正しく表示されるコンパチビリティクラスを提供しています。
以下に使用例を示します。
from definable_serializer.models.compat import YAMLField as CompatYAMLField
class Answer(models.Model):
..
answer = CompatYAMLField(
verbose_name="answer data",
help_text="answer data"
)