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 처리해주어서 한번만 쿼리 실행할 수 있다.
반응형