<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Django on Shiglass</title>
    <link>https://hirotoshimizu.github.io/categories/django/</link>
    <description>Recent content in Django on Shiglass</description>
    <generator>Hugo -- gohugo.io</generator>
    <lastBuildDate>Wed, 28 Jul 2021 19:59:35 +0900</lastBuildDate><atom:link href="https://hirotoshimizu.github.io/categories/django/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>2021 07 29</title>
      <link>https://hirotoshimizu.github.io/posts/2021-07-29/</link>
      <pubDate>Wed, 28 Jul 2021 19:59:35 +0900</pubDate>
      
      <guid>https://hirotoshimizu.github.io/posts/2021-07-29/</guid>
      <description>Responses HttpResponse オブジェクトと違い、レンダリングされたコンテンツでResponseオブジェクトをインスタンス化する必要がない。 その代わりにレンダリングされていないデータをパスする必要がある。
Responseクラスで使用されるレンダラーは、Djangoモデルインスタンスなどの複雑なデータ型をネイティブに処理できないため、Responseオブジェクトを作成する前に、データをプリミティブデータ型にシリアル化する必要があります。
REST frameworkのSerializerクラスを使ってこのデータをシリアライズするか、カスタムシリアライザーを使用する。
引数
 data : レスポンス用のシリアライズされたデータ status : レスポンス用のステータスコード　デフォルトでは 200 template_name : HTMLRenderer が選択されているならテンプレート名 header : レスポンス用の辞書型 HTTP ヘッダー content_type : レスポンス用のコンテンツタイプ。一般的にコンテンツネゴシエーションのrenderer によって自動的に設定される。しかし、場合によっては明示的にコンテンツタイプを特定する必要もある。  プロジェクトが既にある場合 ユーザーモデルは拡張する。
最初から作成する場合は モデルをオーバーライドして独自のカスタムモデルを作成
カスタムユーザーモデルは</description>
    </item>
    
    <item>
      <title>2021 07 28</title>
      <link>https://hirotoshimizu.github.io/posts/2021-07-28/</link>
      <pubDate>Tue, 27 Jul 2021 21:51:50 +0900</pubDate>
      
      <guid>https://hirotoshimizu.github.io/posts/2021-07-28/</guid>
      <description>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はどのアクションも含んでいないので、 クラスをオーバーライドして明示的に定義する必要がある。</description>
    </item>
    
    <item>
      <title>Djnagoの管理画面からCSVファイルをアップしてデータ登録</title>
      <link>https://hirotoshimizu.github.io/posts/2021-07-19/</link>
      <pubDate>Mon, 19 Jul 2021 11:56:10 +0900</pubDate>
      
      <guid>https://hirotoshimizu.github.io/posts/2021-07-19/</guid>
      <description>今回は 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 &amp;#39;admin/change_list.html&amp;#39; %} {% load static %} {% block content %} &amp;lt;a href=&amp;#34;upload-csv/&amp;#34;&amp;gt;Upload a csv file&amp;lt;/a&amp;gt; {{ 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(&amp;#39;upload-csv/&amp;#39;, self.</description>
    </item>
    
    <item>
      <title>2021 07 13</title>
      <link>https://hirotoshimizu.github.io/posts/2021-07-14/</link>
      <pubDate>Tue, 13 Jul 2021 23:32:01 +0900</pubDate>
      
      <guid>https://hirotoshimizu.github.io/posts/2021-07-14/</guid>
      <description>PrimaryKeyRelatedField PrimaryKeyRelatedField を使用することでリレーションのあるテーブルのプライマリーキーを取得することが出来る。
class StatusSerializer(serializers.ModelSerializer): uri = serializers.SerializerMethodField(read_only=True) user = UserPublicSerializer(read_only=True) user_id = serializers.PrimaryKeyRelatedField(source=&amp;#39;user&amp;#39;, read_only=True) class Meta: model = Status fields = [ &amp;#39;uri&amp;#39;, &amp;#39;user_id&amp;#39;, &amp;#39;id&amp;#39;, &amp;#39;user&amp;#39;, &amp;#39;content&amp;#39;, &amp;#39;image&amp;#39; ] read_only_fields = [&amp;#39;user&amp;#39;]  &amp;quot;results&amp;quot;: [ { &amp;quot;uri&amp;quot;: &amp;quot;http://127.0.0.1:8000/api/status/1/&amp;quot;, &amp;quot;id&amp;quot;: 7, &amp;quot;user_id&amp;quot;: 1, &amp;quot;user&amp;quot;: { &amp;quot;id&amp;quot;: 1, &amp;quot;username&amp;quot;: &amp;quot;test&amp;quot;, &amp;quot;uri&amp;quot;: &amp;quot;http://127.0.0.1:8000/api/user/test/&amp;quot; }, &amp;quot;content&amp;quot;: &amp;quot;do some stuff here&amp;quot;, &amp;quot;image&amp;quot;: &amp;quot;http://127.0.0.1:8000/media/status/test/images.png&amp;quot; }, DRF ドキュメント
HyperlinkedRelatedField PrimaryKeyRelatedField を使用することでリレーションのあるテーブルのターゲットのハイパーリンクを取得することが出来る。
class StatusSerializer(serializers.ModelSerializer): uri = serializers.SerializerMethodField(read_only=True) user = UserPublicSerializer(read_only=True) user_id = serializers.</description>
    </item>
    
    <item>
      <title>2021 07 12</title>
      <link>https://hirotoshimizu.github.io/posts/2021-07-12/</link>
      <pubDate>Sun, 11 Jul 2021 06:49:02 +0900</pubDate>
      
      <guid>https://hirotoshimizu.github.io/posts/2021-07-12/</guid>
      <description>Authenticating users authenticate(request=None, **credentials)
authenticate() は認証の承認のために使用する関数。 デフォルトでは keyword arguments で username と password で認証し、 User オブジェクトを返す。
set_password(raw_password)
パスワードをハッシュ化するのに使う。</description>
    </item>
    
    <item>
      <title>2021 07 11</title>
      <link>https://hirotoshimizu.github.io/posts/2021-07-11/</link>
      <pubDate>Fri, 09 Jul 2021 23:37:25 +0900</pubDate>
      
      <guid>https://hirotoshimizu.github.io/posts/2021-07-11/</guid>
      <description>python での JSON の扱いについてわすれるのでメモ。
json.dumps json.dumps()に入れた変数を JSON string に変換する。
&amp;gt;&amp;gt;&amp;gt; import json &amp;gt;&amp;gt;&amp;gt; data = {&#39;abc&#39;: 123} &amp;gt;&amp;gt;&amp;gt; type(data_json) &amp;lt;class &#39;str&#39;&amp;gt; &amp;gt;&amp;gt;&amp;gt; data_json = json.dumps(data) &amp;gt;&amp;gt;&amp;gt; data_json &#39;{&amp;quot;abc&amp;quot;: 123}&#39; json.loads json.loads(JSON string) で python dictionary に型を変換する。
&amp;gt;&amp;gt;&amp;gt; import json &amp;gt;&amp;gt;&amp;gt; data = {&#39;abc&#39;: 123} &amp;gt;&amp;gt;&amp;gt; type(data_json) &amp;lt;class &#39;str&#39;&amp;gt; &amp;gt;&amp;gt;&amp;gt; data_json = json.dumps(data) &amp;gt;&amp;gt;&amp;gt; data_json &#39;{&amp;quot;abc&amp;quot;: 123}&#39; &amp;gt;&amp;gt;&amp;gt; load_json = json.loads(data_json) &amp;gt;&amp;gt;&amp;gt; load_json {&#39;abc&#39;: 123} &amp;gt;&amp;gt;&amp;gt; type(load_json) &amp;lt;class &#39;dict&#39;&amp;gt; &amp;gt;&amp;gt;&amp;gt; load_json[&#39;abc&#39;] 123 Django Rest Framework</description>
    </item>
    
    <item>
      <title>2021 07 08</title>
      <link>https://hirotoshimizu.github.io/posts/2021-07-08/</link>
      <pubDate>Thu, 08 Jul 2021 08:04:28 +0900</pubDate>
      
      <guid>https://hirotoshimizu.github.io/posts/2021-07-08/</guid>
      <description>DRFでオブジェクトを作成したとき、 デフォルトで、 作成したオブジェクトを含むディクショナリー型でデータを返す。
keys() Pythonの組み込み関数。
keys() dict = {&amp;#34;A&amp;#34;: &amp;#34;Abalone&amp;#34;, &amp;#34;B&amp;#34;: &amp;#34;bluefin tuna&amp;#34;, &amp;#34;C&amp;#34;: &amp;#34;cod&amp;#34;} print(dict.keys()) &amp;gt;&amp;gt;&amp;gt;dict_keys([&amp;#39;A&amp;#39;, &amp;#39;B&amp;#39;, &amp;#39;C&amp;#39;]) dict = {&amp;#34;A&amp;#34;: &amp;#34;Abalone&amp;#34;, &amp;#34;B&amp;#34;: &amp;#34;bluefin tuna&amp;#34;, &amp;#34;C&amp;#34;: &amp;#34;cod&amp;#34;} for key in dict.keys(): print(key) &amp;gt;&amp;gt;&amp;gt;A &amp;gt;&amp;gt;&amp;gt;B &amp;gt;&amp;gt;&amp;gt;C getattr Pythonの組み込み関数。
getattr(object, name[,default]) 第一引数に指定された object の値を返す。 第二引数の name は文字列である必要があり、文字列が object の属性の一つの名前であった場合、戻り値はその属性の値になる。
query_params request.GETと同義語。
DRF では query_params を使用することを推奨。
DRF ドキュメント</description>
    </item>
    
    <item>
      <title>Django Rest Framework</title>
      <link>https://hirotoshimizu.github.io/posts/django-rest-framework/</link>
      <pubDate>Wed, 07 Jul 2021 11:51:51 +0900</pubDate>
      
      <guid>https://hirotoshimizu.github.io/posts/django-rest-framework/</guid>
      <description>APIClient APIClientは Djang の Clientクラスを拡張したもの .get()、.post()、.put()、.pathch()、.delete()、.head()、.options()が利用可能。
例
from rest_framework.test import APIClient client = APIClient() client.post(&#39;/notes/&#39;, {&#39;title&#39;: &#39;new idea&#39;}, format=&#39;json&#39;) status from rest_framework import status 人間が読むことができるステータスコードを含む。 テストの際に理解が簡単 github
refresh_from_db() モデルのバリューをリフレッシュ使うのに使用。 このメソッドが引数なしで呼ばれると
 モデル上の遅延評価されない全てのフィールドはその時点でデータベース上に存在する値に更新されます。 キャッシュされたリレーションはリロードされたインスタンスに削除される。 Django ドキュメント  force_authenticate() テストする際に強制的に認証をリクエストする
force_authenticate(request, user=None, token=None)が呼ばれる時 user か token のいずれか、または両方を設定できる。
GenericViewSet GenericViewSet クラスは GenericAPIView の継承し、get_object、get_queryset を提供し、デフォルトでは
GenericViewSetクラスを使用するには、クラスをオーバーライドして、必要なmixinクラスをミックスインするか、アクションの実装を明示的に定義します。
DRF ドキュメント
ModelSerializer ModelSerializerクラスはSerializer  class とモデルの一致するフィールドを自動で作成する
ModelSerializer クラスは Serializer と同じだが、 *モデルを基にフィールドを自動で作成する *unique_together のようなserializerのためのvalidatorを自動で作成する *デフォルトで .create() .update() 含む。</description>
    </item>
    
  </channel>
</rss>
