<aside> 📌 시스템 분석과 데이터베이스 설계는 이미 완성된 상태에서 진행

</aside>

진행 계기

Django REST framework 튜토리얼 완료 후 API 제작 연습하기

목적

app 구조

Models

[MySQL] 스터디카페 관리시스템 개발 (4) 시스템 구현 및 운영

Untitled

# rental\\models.py

class Student(models.Model):
    user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=30)
    residual_time = models.IntegerField(default=0)

class Ticket(models.Model):
    time = models.IntegerField()
    storable = models.BooleanField()
    price = models.IntegerField()
    student = models.ManyToManyField(Student, through='Purchase')
    

class Purchase(models.Model):
    student = models.ForeignKey(Student, related_name='purchase', on_delete=models.CASCADE)
    ticket = models.ForeignKey(Ticket, related_name='purchase', on_delete=models.CASCADE)
    date = models.DateTimeField(auto_now_add=True)
    

class Seat(models.Model):
    student = models.ManyToManyField(Student, through='Rent')
    

class Rent(models.Model):
    student = models.ForeignKey(Student, related_name='rent', on_delete=models.CASCADE)
    seat = models.ForeignKey(Seat, related_name='rent', on_delete=models.CASCADE)
    start_date = models.DateTimeField(auto_now_add=True)
    real_end_date = models.DateTimeField(blank=True)
    expected_end_date = models.DateTimeField()  # blank=True?

URIs

API Endpoints

Permissions

Serializers

DRF Serializer에서 ManyToManyField 구현 → 평소에 접근하는 방향에 따라 결정!

DRF에서 MySQL의 Trigger 구현:

Rent 모델의 expected_end_date 필드에서 blank & null 속성

선택 1. null=True, blank=True

현재시각으로 초기화하는 방법도 있는데, 이 경우와 같은 방식으로 구현한다.

우선 rent 객체를 생성할 때는 필드값을 비워놓고, trigger나 view에서 ORM을 실행하여 올바른 값을 할당한다.

선택 2. null=False, blank=False (default)

rent 객체가 save되기 전에 필드에 값을 전달한다. 쿼리 실행 지연으로 인해 start_date와 현재시각이 다를 수 있다(?)

참고로, MySQL에서는 before insert trigger를 이용했다.

# cal_expected_end_date 트리거
drop trigger if exists cal_expected_end_date;

create trigger cal_expected_end_date
before insert on Rent
for each row
    set new.expected_end_date = date_add(new.start_date, 
        interval(select residual_time from Student where student_id = new.student_id) second);

예정 일시에 대여 마감 점검

Celery with Django

대여 중 구매 로직

storable 대여 중 storable 이용권 구매

storable 대여 중 instorable 이용권 구매

instorable 대여 중 storable 이용권 구매

instorable 대여 중 instorable 이용권 구매

문제상황) 저장 안되는 거 겁나 많이 사고 마지막에 저장되는 거 사면 전부 저장됨

아예 저장 안될 때는 안되는 것만,

가능할 때는 되는 것만 구매 가능?