2024. 4. 9. 20:04ㆍWeb, Django, DB
- Many to many relationships (N:M , M:N)
한 테이블의 0개 이상의 레코드가 다른 테이블의 0개 이상의 레코드와 관련된 경우
양쪽 모두에서 N:1 관계를 가진다.
서로가 서로에게 종속되어있지 않은 관계!
⇒ Django 에서는 ‘ManyToManyField’ 로 중개 모델을 자동으로 생성
- ManyToManyField( )
M:N 관계 설정 시 사용하는 모델 필드
- ‘through’
중개 테이블에 추가 데이터를 사용해 M:N 관계를 형성하려는 경우에 사용
- M:N 관계 주요 사항들
M:N 관계로 맺어진 두 테이블에는 물리적인 변화가 없다.
ManyToManyField 는 중개 테이블을 자동으로 생성한다.
ManyToManyField 는 M:N 관계를 맺는 두 모델 어디에 위치해도 상관 없다. (다만 필드 작성 위치에 따라 참조와 역참조 방향이 달라짐을 주의)
N:1 은 완전한 종속 관계였지만, M:N 은 일방적인 종속 관계가 아니다.
- ManyToManyField의 대표 인자 3가지
- ‘related_name’ 역참조 시 사용하는 manager name을 변경한다. 이름을 변경하면 이전의 역참조 매니저 이름은 쓸 수 없게 된다.
- ‘symmetrical’ 관계 설정 시 대칭 유무를 설정한다. (기본 값 = True) ManyToManyField 가 동일한 모델을 가리키는 정의에서만 사용한다. True 일 경우, 관계를 시작하는 모델 (=source 모델)의 인스턴스가 관계의 대상이 되는 모델(=target 모델) 의 인스턴스를 참조하면 자동으로 target 모델 인스턴스도 source 모델 인스턴스를 참조하여 대칭을 이루도록 한다. ex) 팔로우를 하면 자동으로 맞팔로우가 된다.
- ‘through’ 사용하고자 하는 중개 모델을 지정한다. 추가 데이터를 M:N 관계와 연결하려는 경우에 활용한다.
- M:N 관계에서의 대표 methods
add( ) → 지정된 객체를 관련 객체 집합에 추가한다. (이미 존재하는 관계일 경우 관계가 복제되지 않음)
remove( ) → 관련 객체 집합에서 지정된 모델 객체를 제거한다.
- Many to many relationships
한 테이블의 0개 이상의 레코드가 다른 테이블의 0개 이상의 레코드와 관련된 경우
(양쪽 모두에서 N:1 관계를 가진다)
- .exists( )
QuerySet에 결과가 포함되어 있으면 True를 반환하고 결과가 포함되어 있지 않으면 False를 반환한다.
큰 QuerySet에 있는 특정 객체를 검색할 때 유용하다.
- Fixtures
Django가 데이터베이스로 가져오는 방법을 알고 있는 데이터 모음
⇒ 데이터가 데이터베이스 구조에 맞추어 작성되어있다.
⇒ 프로젝트의 데이터베이스에 초기 데이터를 제공하기 위해 사용한다.
⇒ Fixtures 파일 기본 경로 : Django는 설치된 모든 앱의 디렉토리에서 fixtures 폴더 이후의 경로로 fixtures 파일을 찾아 load 한다.
Fixtures 파일은 직접 만들지 말고 반드시 dumpdata 명령어를 사용하여 생성하자
- fixtures 관련 명령어
- dumpdata = 생성 : 데이터베이스의 모든 데이터를 추출 ex) python manage.py dumpdata —indent 4 앱이름.모델클래스이름 > 이름(보통 모델이름).json
- loaddata = 로드 : Fixtures 데이터를 데이터베이스로 불러오기 ex) python manage.py loaddata articles.json users.json comments.json
- loaddata 순서 주의사항
만약 loaddata 를 한번에 실행하지 않고 별도로 실행한다면 모델 사이의 관계에 따라 load 순서가 중요해질 수 있다.
각 모델에서 다른 모델을 외래 키로 참조할 경우 참조 대상인 모델이 먼저 load 되어야 오류가 발생하지 않는다.
- loaddata 시 encoding codec 관련 에러가 발생하는 경우
2가지 방법이 있다.
- dumpdata 시 추가 옵션 작성 python -Xutf8 manage.py dumpdata 이하생략
- 메모장으로 다시 저장 → 메모장으로 json 파일을 열고 다른 이름으로 저장할 때 인코딩을 UTF8로 선택하여 저장한다.
- improve query
같은 결과를 얻더라도 DB 측에 보내는 query 개수를 줄여 query 문을 개선하는 것
⇒ 요약 : SELECT 한번에 잘 가져오는 것이 중요하다!!
- annotate
SQL의 GROUP BY를 사용한다.
- select_related
SQL의 INNER JOIN을 사용한다.
(1:1 또는 N:1 참조 관계에서 사용)
- prefetch_related
M:N 또는 N:1 역참조 관계에서 사용한다.
SQL이 아닌 Python을 사용한 JOIN을 진행
다만, 최적화보다 중요한 것은 필요한 데이터를 잘 가져오는 것이다.
섣부르게 최적화에 집착하지 말 것.
먼저 정확도를 확보하고 그 이후에 효율을 챙기자!
'Web, Django, DB' 카테고리의 다른 글
Django : REST API (추가) (0) | 2024.04.16 |
---|---|
Django : REST API (1) | 2024.04.13 |
DB : Many to one relationships (추가) (0) | 2024.04.04 |
DB : Many to one relationships (0) | 2024.04.03 |
SQL (0) | 2024.04.02 |