前提
docker-compose.yml を作成できていて
command: python manage.py runserver 0.0.0.0:8001 volumes: - .:/code ports: - "8002:8001"
localhost 8002 のアクセスで
Django のロケットページが出るようになっていてる状態
ターミナルでテーブルの読み書きができる状態
これまでの models と serializers
https://www.django-rest-framework.org/tutorial/1-serialization/#using-modelserializers
class Snippet(models.Model): created = models.DateTimeField(auto_now_add=True) title = models.CharField(max_length=100, blank=True, default='') code = models.TextField() linenos = models.BooleanField(default=False) language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100) style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100) class Meta: ordering = ['created']
snippets/models.py に
created, title, code, linenos, language, style,
これらのカラム名とデータの型たちを定義して
Meta を作って
一括して作成日順に並べる。
https://yu-nix.com/blog/2021/2/24/django-meta/
Meta の使い方はこのサイトが詳しかった。
class SnippetSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) title = serializers.CharField(required=False, allow_blank=True, max_length=100) code = serializers.CharField(style={'base_template': 'textarea.html'}) linenos = serializers.BooleanField(required=False) language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python') style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')
serializer では
id, title, code, linenos, language, style,
これらのフィールドをシリアライズする。
model と比べると created がなくて id が増えている。
shell で model とシリアライザの動作確認
dc run web python manage.py shell Starting rest5_db_1 ... done Creating rest5_web_run ... done Python 3.10.1 (main, Dec 21 2021, 06:15:32) [GCC 10.2.1 20210110] on linux Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>>
まだ view には組み込んでないので、shell を起動して
from snippets.serializers import SnippetSerializer serializer = SnippetSerializer() print(repr(serializer))
Snippet のシリアライザを出力する
SnippetSerializer(): id = IntegerField(read_only=True) title = CharField(allow_blank=True, max_length=100, required=False) code = CharField(style={'base_template': 'textarea.html'}) linenos = BooleanField(required=False) language = ChoiceField(choices=[('abap', 'ABAP'),
すると、シリアライザの型が表示される。
Serializer の id ~ style の再定義をモデルから継承して省略する
class SnippetSerializer(serializers.ModelSerializer):
Snippetシリアライザの引数を
普通のシリアライザから、Modelシリアライザに変更し
class Meta: model = Snippet fields = ['id', 'title', 'code', 'linenos', 'language', 'style']
id ~ style のカラムの再定義している内容を
model とフィールドを指定することで引き継ぐ。
shell で 短く書いた Snippetシリアライザを出力してみる
from snippets.serializers import SnippetSerializer serializer = SnippetSerializer() print(repr(serializer))
SnippetSerializer(): id = IntegerField(label='ID', read_only=True) title = CharField(allow_blank=True, max_length=100, required=False) code = CharField(style={'base_template': 'textarea.html'}) linenos = BooleanField(required=False) language = ChoiceField(choices=[('abap', 'ABAP'),
全く同じようにカラムの型が表示される。
Top comments (0)