Today I Learned/django

(장고) ORM tutorial #3. OneToMany, ForeignKey()

하나719 2023. 8. 21. 15:17
반응형

https://www.pythontutorial.net/django-tutorial/django-one-to-many/

 

Django One-To-Many Relationship

In this tutorial, you'll learn about one-to-many relationships in Django and how to use the ForeignKey to model them.

www.pythontutorial.net

1:N 관계는 ForeignKey() 함수로 정의해준다. 

부서 모델을 추가할 건데, 한 부서당 여러 직원을 가질 수 있으므로 부서:직원 = 1:N 관계를 가진다.

이 때, N인 테이블에 ForeignKey를 지정해주면 된다. (상대 테이블에는 정의 X)

 

1. Department 모델 정의

class Department(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField(null = True, blank=True)

2. Employee 모델에 연결 추가 

  • on_delete 조건 참고 
    • contact는 models.SET_NULL 로 변경해줌 -> 연결된 연락처 정보가 삭제되어도 employee데이터가 지워지지 않음 , 해당 컬럼 값을 null로 변경 해줌. null=True 조건일때 사용가능
    • department가 삭제될 경우 연결된 employee 데이터 모두 삭제됨 
class Employee(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    contact = models.OneToOneField(Contact, on_delete=models.SET_NULL, null=True) #contact 지워져도 employee 연결된 안지워짐
    department = models.ForeignKey(Department, on_delete=models.CASCADE, default= '' ) # department 지워지면 연결된 employee 모두 삭제됨

    def __str__(self):
        return f'{self.first_name} {self.last_name}'

3. shell 에서 데이터 추가

- employee객체 생성시 department 설정 안해주면 오류 발생 

# department추가
d = Department(name='IT', description = 'Information Technology')
d.save()

# employee생성
e = Employee(first_name = 'choi' , last_name = 'Joey', department = d) 
e.save() 

# 직원의 부서 조회 
e.department.description

4. join: select_related('department') 

조인 없이 employee의 부서 출력하기

>> Employee.objects.get(id=5).department.description

select_related() 사용하기

>> Employee.objects.select_related('department').get(id=5).department.description

-> 1번처럼 하면 두번 쿼리 실행되는 이슈가 있다. select_related() 사용하면 join 처리해주어서 한번만 쿼리 실행할 수 있다. 

 

반응형