Yaji_S’s diary

プログラミング学習のアウトプットブログ

【Django】Userモデルの拡張について

DjangoにはデフォルトでUserモデルがありますが、

細かな情報を登録しようとする場合、Userモデルを拡張する必要があります。

Userモデルの拡張には幾つか手法があるのですが、今回デフォルトで備わっているAbstractUserを継承した拡張Userモデル(CustomUser)を構築します。

 

app名/models.py
 
from django.db import models
from django.contrib.auth.models import AbstractUser # AbstractUserをインポート


class CustomUser(AbstractUser):
class Meta:
db_table = 'custom_user'# テーブル名
 
# 以下にな情報を設定
gender = models.CharField(verbose_name='性別', max_length=5, null=True, blank=True)
profession = models.CharField(verbose_name='職業', max_length=15, null=True, blank=True)
...
 
 
setting.py に下記コード追記
 
AUTH_USER_MODEL = 'app名.CustomUser'

 

ただし、今回の手法ではプロジェクト立ち上げの初期段階で実施する必要があります。

後から拡張する場合は新たなテーブル(profileなど)をUserと1対1のリレーションを組む方法が望ましいそうです。

 

app名/models.py
 
from django.db import models
from django.contrib.auth.models import User # Userモデルをインポート


class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE) # Userと1対1のリレーション
# 以下にな情報を設定
gender = models.CharField(verbose_name='性別', max_length=5, null=True, blank=True)
...

【Django】MySQLの設定について

pythonのWebフレームワークであるDjangoでアプリの作成をしております。

アプリ作成で学習したことをしばらくアウトプットして行きます。

 

SQLの設定(今回はMySQL

デフォルトではSQLiteですが、セキュリティー、スケールの面で難ありとのことで、

今回はMySQLを選択

app.setting.py(デフォルトの状態)
 
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
 
MySQLに変更(最小限の設定)の場合
ドライバ「mysqlclient」等をpipでインストール後
app.setting.py

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '設定するDB名',
'USER': 'ユーザー名(デフォルトのままならroot)',
'PASSWORE': 'パスワード',
}
}
 
他にもPostgreSQL, OrecleなどのSQLも選択可能ですが、今回は説明は割愛します。
 
 
 

学習の振り返り(2) 設計とテスト

1. 今週の学習内容

 今週も先週に引き続き、スクールでのカリキュラムを進めました。

  (1)アプリケーションのサービス設計について

   ・企画→ 要件定義→ DB設計→ 開発→ 保守/運用 の順に実施されていく

   ・DB設計ではNOT NULL制約など扱うカラムに対して様々な制約を施す。

   ・DBは情報が混在するエンティティを分離する(第三正規形)

 

  (2)RSpecを用いたテストの実施

   ・FactoryBotを使用しインスタンスをまとめる。

    またFakerを使ってランダム値を入力させる。

   ・開発者が意図した動作挙動である「正常系」、

    意図していない挙動である「異常形」に分けてテストを行う。

   ・機能単位でのテストである「単体テスト」と

    ユーザーが使う状態を再現してテストする「結合テスト」がある。

   ・「結合テスト」はユーザーが目的の動作を実施する過程を洗い出し、

     各過程に対応したテストコードをコーディングする。

     →動作過程の洗い出しはテストするアプリケーションの仕様設計の理解度と

      網羅力、想定力が問われる。

 

   (3)GitHubの使い方について

   ・各種操作の実施

    (commit, push, pull, pull request作成と回答, branchの作成, margin)

   ・コンフリクト対応

    →Resolve conflictsで複数のファイルを目的の内容に修正する。

 

2. まとめ、所見

 今週はどちらかというとアプリケーションを作るような内容ではないですが、

 いづれの内容も基礎的な技術であるので、疎かにせず、今のうちにおさえて

 おきたいです。

 また、テストや設計思想で問われる「網羅力」、「想定力」はソフトスキルだと

 思いますので、現在の環境でも必要ですし、トレーニングできるものであるので、

 今の内からでも鍛えていきたいです。

学習の振り返り(1) アプリ作成のチュートリアル

 1. 今週の学習内容

 今週は主にスクールでのカリキュラムを進めました。

  (1)ruby on rails を使用したアプリ作成のチュートリアル

    ・写真投稿アプリの作成

    ・ユーザー登録、投稿・編集・削除、コメント機能などの実装

 

  (2)DBの設計について

    ・上記のチュートリアルでを例にした設計の考え方

     (①ユーザ情報、②投稿情報、③コメント情報のテーブルの関係性)

 

  (3)レスポンシブWebデザインについて

    Webサイトを閲覧するデバイス別(PC,タブレット,スマートフォン)に対応

    する柔軟なレイアウトの切替について

 

 2. 学習で間違えた所

  ruby on rails を使用したアプリ作成のチュートリアル

  投稿の削除の機能がうまく機能しなかった。(添付写真参照)

   ・削除までの流れでエラーや不具合はなし

   ・削除完了の案内後、投稿を確認するとまだ残っている

 

ここから削除をすると

f:id:Yaji_S:20200816192939p:plain

投稿の一覧を確認すると‥

f:id:Yaji_S:20200816193133p:plain
一見上手くいったように見えましたが投稿が残った状態です

 

3. 解決

コントローラーに定義したメソッドのスペルミスが原因だったようです。

(完全なヒューマンエラーでした💧)

def create
Tweet.create(tweet_params)
end

def dstry(←destroyの間違い)
tweet = Tweet.find(params[:id])
tweet.destroy
end

def edit
end

 

3. まとめ

初学者の私にとって、エラーとか不具合があった時は結構焦りますが、

原因を見つけるとちょっとした事が原因だったりするのが多い気がします。

日頃から自分のミスや癖を分析して、不具合が起きた際は、まずその線を洗ってみると良いかもしれませんね。(プログラミング以外についても同じかもしれませんが‥)

ブログ開設

初めまして、Yajiと申します。

この度、ブログを開設しました。

私は現在、エンジニアを目指して、平日は会社で勤務しながら、プログラミングスクルーに通い、勉強しています。当ブログは学習のアウトプットを目的として開設しました。

 

今まで、ブログを書いた事がなく、至らない点が多々あるとは思いますが、

私と同じくエンジニアを目指している方、また、これからエンジニアを目指そうと、考えている方へ、何か少しでも役に立つ情報を発信できればと思っております。

これから、宜しくお願いします。