1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

顧客管理システムのモデル作成

Posted at

この記事は、「Djangoを使用した顧客管理システムの作成」の2つ目の記事です。

モデル作成

作業内容

上記の記事で行った要件定義を基に以下の作業を行っていきます。

  1. モデルの実装
    • 顧客モデル:Customer
    • 商談履歴モデル:Deal
    • カテゴリモデル:Category
  2. リレーション設定
    • 顧客と商談履歴のリレーション(多対1)
    • カテゴリと顧客のリレーション(多対多)
  3. マイグレーション
    • モデルをマイグレーションしてデータベースに適用

モデルの実装

アプリケーションを作成したときに生成されたcrm_appフォルダの中のmodels.pyを編集することでモデルの実装を行う。
作成されたmodels.pyには最初からdjango.db.modelsがインポートされていて、django.db.modelsの中にあるDjangoの基底クラスModelを使用することで、データベースのテーブルを定義します。
以下が作成したモデルになります。

crm_app/models.py
from django.db import models


class Category(models.Model):
    name = models.CharField(max_length=50,verbose_name='カテゴリ名')
    description = models.TextField(verbose_name='カテゴリの説明')
    
    def __str__(self):
        return self.name

class Customer(models.Model):
    name = models.CharField(max_length=100,verbose_name='顧客名')
    email = models.EmailField(verbose_name='メールアドレス')
    phone = models.CharField(max_length=15,verbose_name='電話番号')
    address = models.TextField(verbose_name='住所',blank=True)
    categories = models.ManyToManyField(Category,blank=True)
    created_at = models.DateTimeField(auto_now_add=True,verbose_name='登録日')
    
    def __str__(self):
        return self.name

class Deal(models.Model):
    customer = models.ForeignKey(Customer,on_delete=models.CASCADE)
    title = models.CharField(max_length=200,verbose_name='商談タイトル')
    date = models.DateTimeField(verbose_name='商談日')
    content = models.TextField(verbose_name='商談内容',blank=True)
    responsible_staff = models.CharField(max_length=50,verbose_name='担当者')
    
    def __str__(self):
        return f"{self.title} - {self.date.strftime('%Y-%m-%d')}"  # 日付をフォーマットして返す

モデルはCharFieldTextFieldのようなフィールドを使用して定義していきます。簡単に使用したフィールドを紹介します。

CharField

主に文字列を扱うフィールドです。カテゴリ名や顧客名などのところで使用しています。
このフィールドは文字数制限max_lengthの引数設定が必要です。

TextField

TextFieldCharField同様に文字列について扱いますが、文字列といっても文章を扱います。改行できるところがCharFieldと異なります。

EmailField

主にメールアドレスを扱うフィールドです。メールアドレスで使用される@の記述がないとエラーを出力します。

DateTimeField

日にちと時間を扱うフィールドです。PythonのDate(Datetime)型例:2024-02-07として扱います。引数のauto_now_addをTrueに設定するとオブジェクトを作成した日時を保持してくれます。

ManyToManyField・ForeignKey

どちらもリレーションを行うフィールドです。詳しくは後ほど説明します。

def _str_(self):について

_str_メソッドはオブジェクトを文字列として表現するときに使われます。モデルで_str_を定義すると、管理画面やシェルでオブジェクトを見やすく表示することができます。

リレーション設定

リレーションとはデータベースのテーブル同士を関連付けることで、Djangoでは簡単に定義することができます。
Djangoでよく使われるリレーションの種類は、以下の3つがあります。

  1. OneToOneField(1対1):1つのモデルのインスタンスが、他のモデルのインスタンスと1対1で対応
  2. ForeignKey(多対1): 複数のレコードが、1つのレコードに紐づく
  3. ManyToManyField(多対多):複数のレコードが、複数のレコードと関係を持つ
    ここでは、使用したForeignKeyManyToManyについて説明します。

ForeignKey

ForeignKeyは1つのモデルが複数の別のモデルのインスタンスを持つ関係を表します。今回の顧客管理システムでは、1人の顧客に対して、複数の商談履歴を持てるようにフィールドを作成しました。

class Customer(models.Model):
    name = models.CharField(max_length=100,verbose_name='顧客名')
    email = models.EmailField(verbose_name='メールアドレス')
    phone = models.CharField(max_length=15,verbose_name='電話番号')
    address = models.TextField(verbose_name='住所',blank=True)
    categories = models.ManyToManyField(Category,blank=True)
    created_at = models.DateTimeField(auto_now_add=True,verbose_name='登録日')


class Deal(models.Model):
    customer = models.ForeignKey(Customer,on_delete=models.CASCADE)

引数のon_deleteは内容を削除するときのオプションを設定するもので、今回の場合は、Customerが削除されたとき、同時に商談履歴Dealも削除されるというものです。

ManyToManyField

ManyToManyFieldは複数のレコードが複数のレコードと関係を持つリレーションを表します。今回で言うと1人の顧客に対して様々な種類のカテゴリで登録できるということです。

class Category(models.Model):
    name = models.CharField(max_length=50,verbose_name='カテゴリ名')
    description = models.TextField(verbose_name='カテゴリの説明')
    
class Customer(models.Model):
    categories = models.ManyToManyField(Category,blank=True)

引数のblankは空欄でも保存できるようにするオプションです。

マイグレーション

Djangoのマイグレーションとは、モデルの変更をデータベースの構造に反映させる仕組みのことです。例えば、モデルを作成したり、変更したりしたときに、データベースに適用させるため使います。
コンソール画面で以下のコードを実行すると行えます。

マイグレーション
python manage.py makemigrations #変更点を検出し、マイグレーションファイルを作成
python manage.py migrate        #データベースに適用

今回はこれで以上です。次回Viewの作成を行います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?