명시적 중간 모델 VS ManyToManyField

송용진·2025년 6월 6일

Python / Django

목록 보기
4/23

명시적 중간 모델

class Schedules(models.Model):
    schedule_id = models.AutoField(primary_key=True)
    rest_id = models.ForeignKey(Restaurant,null=True,on_delete=models.DO_NOTHING)
    created_by = models.ForeignKey(CustomUser,on_delete=models.DO_NOTHING)

    schedule_name = models.CharField(null=True,max_length=100,blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    # schedule_at = models.DateTimeField(null=True,blank=True)
    schedule_condition = models.JSONField(null=True,blank=True)

    # 약속 시간 취합을 위해 필요한 필드 수정 및 추가
    schedule_start = models.DateTimeField(null=True,blank=True)
    schedule_end = models.DateTimeField(null=True,blank=True)
    is_meal = models.BooleanField(default=True)
class Participants(models.Model):
    schedule = models.ForeignKey(
        Schedules,
        on_delete=models.CASCADE,
        related_name="participants"
    )
    participant = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete= models.SET_NULL,
        null=True,
        blank=True
    )

명시적 중간 모델(Participants)을 사용하고 있는데,
추가 필드가 없고 단순한 스케줄-사용자 관계만 있다면
Django의 ManyToManyField를 사용하는 게 더 간결할 수 있음

단, 아래 조건 중 하나라도 해당되면 명시적 중간 모델이 나음
• 향후 Participants 모델에 추가 필드가 들어올 가능성 있음 (예: 참여 승인 여부, 상태 등)
• 명확한 조회 제어가 필요함
• 비즈니스적으로 Participants 자체를 독립된 모델로 관리할 필요 있음

ManyToManyField

class Schedules(models.Model):
    schedule_id = models.AutoField(primary_key=True)
    rest_id = models.ForeignKey(Restaurant,null=True,on_delete=models.DO_NOTHING)
    created_by = models.ForeignKey(CustomUser,on_delete=models.DO_NOTHING)

    schedule_name = models.CharField(null=True,max_length=100,blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    # schedule_at = models.DateTimeField(null=True,blank=True)
    schedule_condition = models.JSONField(null=True,blank=True)

    # 약속 시간 취합을 위해 필요한 필드 수정 및 추가
    schedule_start = models.DateTimeField(null=True,blank=True)
    schedule_end = models.DateTimeField(null=True,blank=True)
    is_meal = models.BooleanField(default=True)
    
 	participants = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="schedules_participated")

이렇게 하면 어떤 구조가 생기나?

•	Django가 자동으로 중간 테이블을 생성
•	예를 들어, schedules_schedules_participants라는 이름의 테이블이 생겨서, 
스케줄 ID ↔ 유저 ID 관계를 저장

profile
개발자

0개의 댓글