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

2021 07 11

python での JSON の扱いについてわすれるのでメモ。 json.dumps json.dumps()に入れた変数を JSON string に変換する。 >>> import json >>> data = {'abc': 123} >>> type(data_json) <class 'str'> >>> data_json = json.dumps(data) >>> data_json '{"abc": 123}' json.loads json.loads(JSON string) で python dictionary に型を変換する。 >>> import json >>> data = {'abc': 123} >>> type(data_json) <class 'str'> >>> data_json = json.dumps(data) >>> data_json '{"abc": 123}' >>> load_json = json.loads(data_json) >>> load_json {'abc': 123} >>> type(load_json) <class 'dict'> >>> load_json['abc'] 123 Django Rest Framework...

July 9, 2021

APIの設計

Web API the good parts エンドポイントの基本的な設計 覚えやすく、どんな機能を持つURIなのかがひと目でわかる 短くて入力しやすいURI 人間が読んで理解できるURL 大文字小文字が混在していないURI 改造しやすい(Hackableな)URI サーバー側のアーキテクチャが反映されていないURI どんなソフトウェア、言語を利用しているのか。 ディレクトリやシステム構成がどうなっているのか。 ルールが統一されたURI リソースにアクセスするための設計の注意点 複数形の名詞を利用する 利用する単語に気をつける スペースやエンコードを必要とする文字を使わない 単語をつなげる必要がある場合はハイフンを利用する リソースの一覧取得のエンドポイントが検索を兼ねる。 絞り込み検索はパラメーターを設定する。 検索に相対位置を利用する問題点 データ数が膨大になるとpageやoffsetを指定されていると「先頭から何件目か」を調べるために先頭から数を数える処理が行われるため遅くなる。 また、更新頻度が高いデータの場合データに不整合が生じる。 絶対位置でデータを問題点 絶対位置指定とは、オフセットで相対位置を指定する代わりに、これまで取得した最後のデータのIDや時間を記録しておいて、「このIDより前のもの」や「この時刻より古いもの」と言った指定を行う方法。 配列とフォーマット オブジェクトで配列を包むメリット レスポンスデータが何をしていものかがわかりやすくなる レスポンスデータをオブジェクトに統一することができる。 セキュリティ上のリスクを避けることができる トップれべるが配列であるJSONは、JSONインジェクションに対するリスクが大きくなる。 続きがある場合どうデータを返すべきか 例えば20件データを返すためには最大21件の取得を行ってみて、実際に21件取得できれば、 「hasNext」といった名前で結果を含めてあげれば良い。

July 9, 2021