Kits

システム、プログラミングなど

Django REST framewrok で 'NoneType' object has no attribute '_meta' serializer エラー

結論から言いますと、 serializers でのユーザーのインポート方法に問題があったようです。

カスタムユーザーを作成して、下記の通りユーザークラスを呼び出して 使用していました。

from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):
  class Meta:
    model = User

下記の通り修正すると正しく動作するようになりました。

from django.contrib.auth import get_user_model

class UserSerializer(serializers.ModelSerializer):
  class Meta:
    model = get_user_model()

Django REST framewrok の環境構築

Windows 端末での Django REST framewrok の
環境構築について説明します。

仮想環境の作成

まず、Python の仮想環境を作成します。
一番手っ取り早いのは anaconda navigator を使用する方法です。

下記サイトから anaconda navigator をインストールします。

docs.anaconda.com

インストールが完了したら、Environments の Create ボタンを押下、
ダイアグが表示されますので、環境名を入力して、Python のバージョンを指定したら Create ボタンを押下します。

f:id:kits04:20210612000242p:plain

これで、仮想環境の作成は完了です。

次に、IDEから仮想環境に接続する設定方法を見てみましょう。

Visual Studio Code を使用する

まず、先ほど作成した仮想環境のパスを確認します。
ターミナルで下記のコマンドを打つと、
仮想環境の一覧とそのパスが表示されます。

conda env list

次に、Ctrl+Shift+P でコマンドパレットを表示してください。
コマンドパレットにsettings.jsonと入力すると選択肢が表示されますので、
Open Workspace setting (JSON) を選択します。

f:id:kits04:20210612003400p:plain

settings.json が開きますので、先ほど取得したパスを下記のように入力して保存します。 バックスラッシュを2重にする点を注意してください。

{
  "python.pythonPath": "取得したパス\\python.exe"
}

もしターミナルの種類がPowerShellになっている場合は Command Promptに変更します。
行の先頭が(仮想環境名)となっていれば、 既に仮想環境に接続された状態となっています。

最後にDjango と djangorestframework をインストールします。

pip install Django
pip install djangorestframework

下記のコマンドでサーバーが起動します。

python manage.py runserver 

Pythonで実行ファイルのパスを取得する

フルパスを取得する方法

import os
print(os.path.realpath(__file__))
print(os.path.abspath(__file__))

abspath は root ディレクトリからの完全パス
realpath は symbolic links を解決したパスを返す。

ディレクトリパスを取得する方法

import os
print(os.getcwd())
print(os.path.dirname(os.path.realpath(__file__)))

TypeScript の enum

TypeScript では enum型(列挙型)を 使用することが出来る。

enum のサンプルコード

enum OS {
  Windows,
  Mac,
  Linux,
}

enum Maker {
  Dell,
  HP,
  ASUS,
}

interface PC {
  os: OS;
  maker: Maker;
}

const myPC: PC = {
  os: OS.Windows,
  maker: Maker.Dell,
}

TypeScript の keyof

TypeScript では keyof でオブジェクトの
キーを取り出すことが出来る。

keyof のサンプルコード

type KEYS = {
  primary: string,
  secondary: string,
  tertiary: string
}

let key: keyof KEYS;
key = "primary"

const COUNTRIES = {
  primary: "USA",
  secondary: "India",
  tertiary: "China"
};

let keyCountry: keyof typeof COUNTRIES;
keyCountry = "primary"