반응형
https://www.pythontutorial.net/django-tutorial/django-one-to-many/
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 처리해주어서 한번만 쿼리 실행할 수 있다.
반응형
'Today I Learned > django' 카테고리의 다른 글
장고 (django) model multiple select choices (항목 여러개 선택하는 모델 만들기) (0) | 2023.08.23 |
---|---|
(장고) ORM tutorial #4. ManyToManyField() (0) | 2023.08.21 |
(장고) ORM tutorial #2. OneToOneField() (0) | 2023.08.21 |
(장고) ORM tutorial #1. all(), get() , filter(), save(), delete() (0) | 2023.08.21 |
장고 (django) - LoginView, LogoutView, LoginRequireMixin 설정하기 (0) | 2023.08.11 |