본문 바로가기
Tech/DB | RDBMS

[Django][DataBase] 프로젝트 DB 구성하기

by 싱브이 2024. 4. 4.
728x90
반응형

 프로젝트 DB 구성을 하기 전에 우리는 하나의 가정을 하고 시작하였다. 

자세하게 말할 수는 없지만, 우리의 시스템 가정상 User는 회원가입을 통해 생성되는 것이 아닌, id와 pw를 부여하는 것으로 가정하였다.

 

아무튼 결론부터 보자면 admin 페이지를 이렇게 구성하였다.

 

 

사실 약간 복잡해진 케이스이긴 한데,

db 구성이 처음이라.. ㅎㅎ.. 누가 처음부터 잘해! 겪고 성장하는거지 뭐!

 

아무튼 먼저 voc, gongsa 이렇게 나누었다.

voc에는 직원만, gongsa에는 사외직원만이 각각 따로 접근해야하기 때문이다!

처음에는 너무 쉽쨔나 하고 했는데, 생각해보니  id와 pw를 부여하는 가정을 제외하고도 몇 가지의 가정이 필요하였다. 

voc는 글을 post하는 것이 아니라 데이터가 넘어오는 것으로 가정하여 admin페이지에서 글을 저장하여 불러오도록 하였다.

그리고 voc user는 공사 페이지에 접근 못하고, 공사 user는 voc 페이지에 접근할 수 없다. 

 


1. voc model

필드

  • phone: 전화번호
  • author: VOC를 작성한 사용자를 나타내는 외래 키 필드입
  • tt: tt 번호
  • updated_at: VOC가 최근에 업데이트된 날짜를 나타내는 필드( VOC가 저장될 때마다 자동으로 업데이트)
  • repair_status: 수리 상태를 나타내는 필드 (선택할 수 있는 값: '수리중', '수리완료', '수리전'_
  • voc_status: VOC 상태를 나타내는 필드 (선택할 수 있는 값: '확인중', '확인완료', '추가조치필요', '발송전'_
  • comment: 사용자 의견 필드
  • created_at: VOC가 생성된 날짜와 시간을 나타내는 필드 (VOC가 생성될 때마다 자동으로 설정)

클래스 메서드

  • get_preparing_vocs: 발송 전 VOC의 수
  • get_processing_vocs: 확인 중인 VOC의 수
  • get_reprocessing_vocs: 추가 조치가 필요한 VOC의 수
  • get_completed_vocs: 확인 완료된 VOC의 수
from django.db import models
from django.utils import timezone
from datetime import date
from django.contrib.auth.models import User

class VOC(models.Model):
    REPAIR_STATUS_CHOICES = [
        ('수리중', '수리중'),
        ('수리완료', '수리완료'),
        ('수리전', '수리전'),
    ]

    VOC_STATUS_CHOICES = [
        ('확인중', '확인중'),
        ('확인완료', '확인완료'),
        ('추가조치필요', '추가조치필요'),
        ('발송전', '발송전'),
    ]


    phone = models.CharField(max_length=20) 
    author = models.ForeignKey(User, on_delete=models.CASCADE, default='')
    tt = models.CharField(max_length=30) 
    updated_at = models.DateField(auto_now=True)
    repair_status = models.CharField(max_length=100, choices=REPAIR_STATUS_CHOICES)
    voc_status = models.CharField(max_length=100, choices=VOC_STATUS_CHOICES, null=True)
    comment = models.TextField(max_length=100, blank=True, null=True) #사용자의견
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.phone
    

    @classmethod
    def get_preparing_vocs(cls):
        return cls.objects.filter(voc_status='발송전').count()

    @classmethod
    def get_processing_vocs(cls):
        return cls.objects.filter(voc_status='확인중').count()

    @classmethod
    def get_reprocessing_vocs(cls):
        return cls.objects.filter(voc_status='추가조치필요').count()

    @classmethod
    def get_completed_vocs(cls):
        return cls.objects.filter(voc_status='확인완료').count()

 

 


2. Profile, Post model

Profile 모델

  • user: User 모델과 일대일 관계를 가지는 외래 키 필드 (User 모델과 연결)
  • group: Group 모델과 외래 키 관계를 가지는 필드 (사용자 그룹)
  • department: 사용자의 부서
  • agency: 사용자의 소속 기관
  • phone: 사용자의 연락처

Post 모델

  • author: User 모델과 외래 키 관계를 가지는 필드 (글의 작성자)
  • created_at: 글이 생성된 날짜 (자동으로 현재 날짜와 시간으로 설정)
  • updated_at: 글이 업데이트된 날짜 (글이 저장될 때마다 자동으로 업데이트)
  • construction_type: 공사 유형
  • start_at: 공사 시작 날짜를
  • end_at: 공사 종료 날짜
  • content: 글의 내용
  • department: 부서 (null 허용)
  • agency: 기관 (null 허용)
  • phone: 연락처 (null 허용)

Post 모델 클래스 메서드

  • get_construction_status: 공사 상태를 반환하는 메서드 (공사 예정, 공사 중, 공사 완료)
  • get_weekly_constructions: 주간 공사 수를 반환
  • get_daily_constructions: 일일 진행 중인 공사 수를 반환
  • get_registered_constructions: 해당 날짜에 등록된 공사 수를 반환
from django.db import models
from django.utils import timezone
from datetime import date
import datetime
from django.contrib.auth.models import User, Group

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    department  = models.CharField(max_length=30)  #부서
    agency  = models.CharField(max_length=30, default='')  #기관
    phone  = models.CharField(max_length=20, default='')  #연락처

# Create your models here.
class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateField(auto_now_add=True)  # Set default value to current date and time
    updated_at = models.DateField(auto_now=True)  # Automatically update on each save
    construction_type = models.CharField(max_length=100)
    start_at = models.DateField(null=True)  # DateField for construction start date
    end_at = models.DateField(null=True)  # DateField for construction end date
    content = models.TextField()
    department  = models.CharField(max_length=30, null=True)  #부서
    agency  = models.CharField(max_length=30, null=True)  #기관
    phone  = models.CharField(max_length=20, null=True)  #연락처
    def get_construction_status(self):
        today = timezone.now().date()

        if self.start_at and self.end_at:
            if today < self.start_at:
                return '공사예정'
            elif self.start_at <= today <= self.end_at:
                return '공사중'
            else:
                return '공사완료'
        else:
            return ''


    def __str__(self):
        return self.construction_type
    

    @classmethod
    def get_weekly_constructions(cls):
        today = datetime.date.today()
        weekday = today.weekday() 
        start_of_week = today - datetime.timedelta(days=weekday)  
        end_of_week = start_of_week + datetime.timedelta(days=6)  
        return cls.objects.filter(start_at__range=[start_of_week, end_of_week]).count()



    @classmethod
    def get_daily_constructions(cls):  #금일진행
        today = date.today()
        return cls.objects.filter(start_at=today).count()

    @classmethod
    def get_registered_constructions(cls):  #신규접수
        today = date.today()
        return cls.objects.filter(created_at=today).count()

 

user의 권한을 어떻게 나눌까에 대한 고민을 살짝 했는데 장고는 그 부분에 대해 편리하게 사용하도록 너무 잘되어 있었다 ! 굳!

Django 에 내장되어 있는 Group을 사용해서 직원과 사외공사직원에 대해 접근 권한을 부여하였다.

 

그리고 추가적으로 고민했던 것은 admin페이지에서 user를 생성하니 추가적인 필드를 어떻게 구성해야할까가 문제였다.

user에 필드를 추가하니 voc에서는 필요없는 필드가 있었기 때문이다.

그래서 생각해낸게 공사 모델에 Profile을 User모델과 일대일 관계로 구성하여 admin페이지를 통해 user를 생성하면 Profile로 받아와 사용자의 부가정보(기관, 부서, 연락처)를 추가적으로 저장하는 방법이다.

 

즉, voc와 공사에서 공통적인 user 필드는 admin에서 user에 저장하고,

추가적으로 필요한 user 정보는 user와 일대일 관계로 구성한 profile로 빼서 추가하였다. 

 

이렇게 했을 때 voc, gongsa 각각 필요한 정보들만 저장하여 사용할 수 있었다!

 

 

ERD

ERD를 출력해보았다.

 

Django 모델 ERD 생성 방법

 

복잡쓰 하군 

 

 

 

728x90
반응형

댓글