0
1

研究室専用就活PFのDB構成を考えてみた

Last updated at Posted at 2024-08-09

就活開始して思ったことが1つ。

先輩いないとやっていけん!

特に同じ研究をしている先輩。

院生は研究内容がガクチカになることが多いので、一般的な就活サイトよりも、同じ研究室内の先輩のエントリーシート(ES)が有益な参考資料となる。

僕も参考にさせてもらってた。

でも、毎回先輩に「○○企業に出したESを見せてください!」とお願いするのは手間がかかるうえ、実際に入手できるまでに時間がかかることが多い。

そこで、過去の先輩の就活情報を集約し、迅速にアクセスできるサイトを作成すればいいのでは。。。?と思った。

今回は、そんな研究室専用就活プラットフォームが完成したので、その際のDB構成を自分用のメモとして解説していく。

なお、研究室の学生が利用することも考えるとサイト設計や認証機能などをきちんと作成したかったので、今回はフルスタックフレームワークであるdjangoを使用した。

まず最初に、完成したコードを下記に示す。

# models.py
from django.db import models
from django.contrib.auth.models import User
from django.conf import settings

class Company(models.Model):
    name = models.CharField(max_length=255)
    industry = models.CharField(max_length=255)
    description = models.TextField(blank=True)

    def __str__(self):
        return self.name 

class EntrySheet(models.Model):
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='entry_sheets')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.company.name} - {self.user.username}"

class Experience(models.Model):
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='experiences')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.company.name} - {self.user.username}"

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')  
    display_name = models.CharField(max_length=255, blank=True, null=True)
    anonymous = models.BooleanField(default=False)

    def __str__(self):
        return self.display_name or self.user.username

class RecentlyViewedCompany(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    viewed_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-viewed_at']  

    def __str__(self):
        return f"{self.user.username} - {self.company.name}"

依存関係

Companyと1対多な関係:Entrysheet、Experience、RecentlyViewedCompany

Userと1対多な関係:Entrysheet、Experience、RecentlyViewedCompany

Userと1対1の関係:Profile

Companyモデル

models.py
class Company(models.Model):
    name = models.CharField(max_length=255)
    industry = models.CharField(max_length=255)
    description = models.TextField(blank=True)

    def __str__(self):
        return self.name 

企業名、業界名、企業詳細の3つの属性を保有する。

管理画面やシェルでは企業名が表示されるように__str__で指定した(企業名は例)↓

image.png

EntrySheetモデル

models.py
class EntrySheet(models.Model):
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='entry_sheets')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.company.name} - {self.user.username}"

会社名、投稿者、投稿したES、投稿日時の4つの属性を保有する。

会社名はCompanyモデルを外部キーとして保有していて、多対1の関係となっている。

また、on_deleteによって、Companyが削除されたら該当エントリーシートもすべて消えるように設定した。

related_nameでは、逆のリレーションを定義する。これを使用すると、Companyオブジェクトから関連するすべてのEntrySheetオブジェクトにアクセスできる。

例えば、company.entry_sheets.all()を使用すると、特定の会社に関連するすべてのエントリーシートを取得できる。

Experienceモデル

models.py
class Experience(models.Model):
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='experiences')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.company.name} - {self.user.username}"

会社名、投稿者、投稿した体験談、投稿日時の4つの属性を保有する。

ここはEntrySheetモデルを構成が全く同じなので説明を割愛する。

Profileモデル

models.py
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')  
    display_name = models.CharField(max_length=255, blank=True, null=True)
    anonymous = models.BooleanField(default=False)

    def __str__(self):
        return self.display_name or self.user.username

投稿者、表示名、匿名の可否の3つの属性を保有する。

Profileモデルは、ユーザーのプロフィールを定義している。そのため、ユーザーモデルと1対1の関係にしている。

また、display_nameは表示名であり、こちらをサイトに表示するかどうかをanonymousによって決定する。

RecentlyViewedCompanyモデル

models.py
class RecentlyViewedCompany(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    viewed_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-viewed_at']  

    def __str__(self):
        return f"{self.user.username} - {self.company.name}"

ユーザーが閲覧した会社の履歴を管理するためのデータモデル。

ユーザーごとにどの会社をいつ閲覧したかを記録し、後で参照することができる。

関連するユーザーと会社を外部キーとして保存し、viewed_atフィールドで閲覧した日時を記録する。

さらに、デフォルトの並び順をviewed_atの降順に設定することで、最新の閲覧履歴を優先して表示することが可能にした。


以上。

今後、このモデルによってどのようなビューを定義しているのかなども記載する予定。

0
1
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
0
1