【Django】複数のモデル情報を1ページに集約しつつ、2つのモデルの橋渡しとなるDBにIDを登録したい

実現したいこと

前提

Djangoを使用して案件のマッチングアプリのようなものを作成中です。
モデルとしては従業員情報、プロジェクト情報、その二つを紐付ける橋渡しとなるモデルの3つがあります。

従業員情報、プロジェクト情報にはそれぞれ生成時にUUIDを設定しています。

プロジェクト情報の詳細ページからマッチング画面へと遷移し、その選択中のプロジェクトとスキルが一致する従業員を表示させ、マッチング決定をすると従業員情報、プロジェクト情報それぞれの固有IDを橋渡しのモデルに登録し、完了する、という流れを想定しています。

発生している問題・エラーメッセージ

クラスベースビューを使用しない、複数引数を利用したビューの作成は経験がなく、どこから手を付けていいかわからない。

また、初めて完全に1からのアプリ作成のため、この処理順が最適かどうかなど、そういった部分も不明

該当のソースコード

※一部コメントの省略などあり

models.py

1import uuid 2from django.db import models 3from django.contrib.auth.models import User 4 5 6# 従業員情報 7class EmployeeInformation(models.Model): 8 # 従業員ID 9 employeeId = models.UUIDField(default=uuid.uuid4, editable=False) 10 # 姓/名(漢字/フリガナ) 11 familyNameKanji = models.CharField(max_length=10) 12 firstNameKanji = models.CharField(max_length=10) 13 familyNameKana = models.CharField(max_length=15) 14 firstNameKana = models.CharField(max_length=15) 15 # 年齢 16 employeeAge = models.IntegerField() 17 # 性別 18 employeeSex = models.CharField(max_length=10) 19 # 最寄駅 20 employeeArea = models.CharField(max_length=15) 21 # 所有資格(従業員IDを流用し、他テーブルとの結合) 22 certification = models.TextField(max_length=100) 23 # メイン言語 24 mainLanguage = models.CharField(max_length=10) 25 # メイン言語の経験年数 26 yearsOfExp = models.IntegerField() 27 # 経歴(結合用ID) 28 careerList = models.UUIDField(default=uuid.uuid4, editable=False) 29 30 def __str__(self): 31 return self.familyNameKanji 32 33 class Meta: 34 ordering = ["yearsOfExp"] 35 36 37# 案件情報 38class ProjectInfomation(models.Model): 39 # 案件識別ID 40 projectId = models.UUIDField(default=uuid.uuid4, editable=False) 41 # 案件概要 42 projectSummary = models.CharField(max_length=50) 43 # 案件登録日 44 projectRegisteredDate = models.DateField(auto_now_add=True) 45 # 依頼企業名 46 projectCliant = models.CharField(max_length=15) 47 # 単価(中央値) 48 projectUnitPrice = models.IntegerField() 49 # 勤務地 50 workPlace = models.CharField(max_length=15) 51 # 必須スキル(言語) 52 requiredLanguage = models.CharField(max_length=10) 53 # 上記の経験年数 54 reqLangExperience = models.IntegerField() 55 # 開発環境 56 projectDevEnv = models.TextField(max_length=100) 57 # 案件詳細 58 projectDetail = models.TextField(max_length=500) 59 60 def __str__(self): 61 return self.workPlace 62 63 class Meta: 64 ordering = ["projectRegisteredDate"] 65 66 67# 登録情報紐付けテーブル 68class InfomationUniteTable(models.Model): 69 # 従業員側targetId 70 empTargetId = models.UUIDField() 71 # 案件側targetId 72 proTargetId = models.UUIDField() 73 # 登録日 74 projectRegisteredDate = models.DateField(auto_now_add=True) 75

views.py

1from django.http import HttpResponse 2from django.shortcuts import render 3from django.urls import reverse_lazy 4from django.views.generic.edit import CreateView 5from django.views.generic.detail import DetailView 6from django.views.generic.list import ListView 7 8from ReteIngenium.models import ( 9 EmployeeInformation, 10 ProjectInfomation, 11 InfomationUniteTable, 12) 13 14 15# トップページ 16def IndexPage(request): 17 return render(request, "index.html") 18 19 20# エンジニア一覧 21class EmployeeList(ListView): 22 model = EmployeeInformation 23 context_object_name = "employees" 24 25 26# エンジニア詳細 27class EmployeeInfo(DetailView): 28 model = EmployeeInformation 29 context_object_name = "employeeDetail" 30 31 32# エンジニア登録 33class EmployeeRegister(CreateView): 34 model = EmployeeInformation 35 fields = [ 36 "familyNameKanji", 37 "firstNameKanji", 38 "familyNameKana", 39 "firstNameKana", 40 "employeeAge", 41 "employeeSex", 42 "employeeArea", 43 "certification", 44 "mainLanguage", 45 "yearsOfExp", 46 ] 47 success_url = reverse_lazy("emList") 48 49 50# 案件一覧 51class ProjectList(ListView): 52 model = ProjectInfomation 53 context_object_name = "projects" 54 55 56# 案件詳細 57class ProjectInfo(DetailView): 58 model = ProjectInfomation 59 context_object_name = "projectDetail" 60 61 62# 案件登録 63class ProjectRegister(CreateView): 64 model = ProjectInfomation 65 fields = [ 66 "projectSummary", 67 "projectCliant", 68 "projectUnitPrice", 69 "workPlace", 70 "requiredLanguage", 71 "reqLangExperience", 72 "projectDevEnv", 73 "projectDetail", 74 ] 75 success_url = reverse_lazy("proList") 76 77 78# TODO 案件受諾(マッチング) 79def EmployeeMatching(request, kwargs): 80 pass 81 return

試したこと

Qittaやteratailなど検索し、複数引数を受け取るものなどは確認したのですが、それでもいまいち理解できませんでした。(自分のやりたいこととサイトに書いてある手段の擦り合わせが出来ず)

補足情報(FW/ツールのバージョンなど)

Python:3.11.4
Django:4.2.2
VScode:1.79.2 (user setup)

コメントを投稿

0 コメント