2021 07 29

Responses HttpResponse オブジェクトと違い、レンダリングされたコンテンツでResponseオブジェクトをインスタンス化する必要がない。 その代わりにレンダリングされていないデータをパスする必要がある。 Responseクラスで使用されるレンダラーは、Djangoモデルインスタンスなどの複雑なデータ型をネイティブに処理できないため、Responseオブジェクトを作成する前に、データをプリミティブデータ型にシリアル化する必要があります。 REST frameworkのSerializerクラスを使ってこのデータをシリアライズするか、カスタムシリアライザーを使用する。 引数 data : レスポンス用のシリアライズされたデータ status : レスポンス用のステータスコード デフォルトでは 200 template_name : HTMLRenderer が選択されているならテンプレート名 header : レスポンス用の辞書型 HTTP ヘッダー content_type : レスポンス用のコンテンツタイプ。一般的にコンテンツネゴシエーションのrenderer によって自動的に設定される。しかし、場合によっては明示的にコンテンツタイプを特定する必要もある。 プロジェクトが既にある場合 ユーザーモデルは拡張する。 最初から作成する場合は モデルをオーバーライドして独自のカスタムモデルを作成 カスタムユーザーモデルは

July 28, 2021

2021 07 28

APIView REST frameworkは Djangoの View class のサブクラスである、 APIViewclassを提供する。 APIViewclass は下記のようにView classとは異なる。 handler methods を通ったRequests は REST frameworkの Request インスタンスになり。 Django の HttpRequestインスタンスではない。 handler methods の return は REST frameworkの Responseとなり、 その view は content negotiation と response に一致した renderer を返す。 どの APIException のエクセプションは正しいレスポンスに仲介される。 来るリクエストは認証され、handler methodsに送る前に、 適切な権限やスロットルチェックが行われる。 DRF ドキュメント ViewSet viewSet classは APIViewを継承している。 viewsetで API policy をコントロールするにあたり、 スタンダードの属性であるpermission_classes,authentication_classesが使える。 viewSet classはどのアクションも含んでいないので、 クラスをオーバーライドして明示的に定義する必要がある。...

July 27, 2021

Djnagoの管理画面からCSVファイルをアップしてデータ登録

今回は restaurants というアプリを作成し進めていきます。 CSVのファイルは管理画面のレストランの一覧画面 http://127.0.0.1:8000/admin/restaurants/restaurant/ からアップ。 アプリの作成 python manage.py startapp restaurants モデルは restaurant で作成。 Admin テンプレートの Override templatesフォルダは manage.py と同じ階層に作成。 templates/admin/restaurants/restaurant/change_list.html を作成 {% extends 'admin/change_list.html' %} {% load static %} {% block content %} <a href="upload-csv/">Upload a csv file</a> {{ block.super }} {% endblock %} {{ block.super }} は親のテンプレートコンテンツ。 Django change_list.html Custom Admin Page の作成 上記で作成したリンク先の upload-csv/ の URL を設定 restaurants/admin.py の RestaurantAdmin で get_urls()を設定。 def get_urls(self): urls = super().get_urls() new_urls = [ path('upload-csv/', self....

July 19, 2021

2021 07 13

PrimaryKeyRelatedField PrimaryKeyRelatedField を使用することでリレーションのあるテーブルのプライマリーキーを取得することが出来る。 class StatusSerializer(serializers.ModelSerializer): uri = serializers.SerializerMethodField(read_only=True) user = UserPublicSerializer(read_only=True) user_id = serializers.PrimaryKeyRelatedField(source='user', read_only=True) class Meta: model = Status fields = [ 'uri', 'user_id', 'id', 'user', 'content', 'image' ] read_only_fields = ['user'] "results": [ { "uri": "http://127.0.0.1:8000/api/status/1/", "id": 7, "user_id": 1, "user": { "id": 1, "username": "test", "uri": "http://127.0.0.1:8000/api/user/test/" }, "content": "do some stuff here", "image": "http://127.0.0.1:8000/media/status/test/images.png" }, DRF ドキュメント HyperlinkedRelatedField PrimaryKeyRelatedField を使用することでリレーションのあるテーブルのターゲットのハイパーリンクを取得することが出来る。 class StatusSerializer(serializers.ModelSerializer): uri = serializers.SerializerMethodField(read_only=True) user = UserPublicSerializer(read_only=True) user_id = serializers....

July 13, 2021

2021 07 12

Authenticating users authenticate(request=None, **credentials) authenticate() は認証の承認のために使用する関数。 デフォルトでは keyword arguments で username と password で認証し、 User オブジェクトを返す。 set_password(raw_password) パスワードをハッシュ化するのに使う。

July 11, 2021