<다양한 외래키와 활용법>
- ForeignKey
- 유저 모델과 게시글 모델 간의 관계
- 한 명의 유저가 여러 게시글을 작성할 수 있음
정참조(Article -> User)
email = article.user.email
역참조(User -> Article)
- 로그인 한 user가 작성한 article들을 가져와라
user = request.user
# user가 작성한 모든 게시글들을 가져와라
articles = user.article_set.all()
# user가 작성한 게시글 중 "조건"에 부합하는 게시글들을 가져와라
articles = user.article_set_filter("조건")
- articles에는 queryset이 담김
- object list = queryset
- OneToOneField
- 유저 모델과 유저의 개인정보 모델 간의 관계
- 한 명의 유저에게는 하나의 개인정보 모델과 관련이 있음
- 하나의 개인정보는 한 명의 유저를 가리킴
- ForeignKey에서 unique=True 옵션을 넣은 것과 같음(장고는 그럴 바에 OneToOneField 를 넣으라고 함)
정참조(PrivateData -> User)
역참조(User -> PrivateData)
- related_name을 지정하지 않았을 때(정참조랑 방법이 똑같음)
private_data = user.userprivatedata
- related_name = private_data 로 지정했을 때
private_data = user.private_data
# related_name 미지정
주민등록번호 = user.userprivatedata.주민등록번호
# related_name = private_data 으로 지정
주민등록번호 = user.private_data .주민등록번호
- 헷갈림 방지를 위해 그냥 다 related_name을 지정해라!
- ManyToManyField
- 유저 모델과 취미 모델 간의 관계
- 유저는 여러 취미를 가질 수 있고, 여러 유저의 취미가 하나로 겹칠 수 있음
정참조(User -> Hobby)
user = request.user
hobby = user.hobby.all()
- hobby에는 queryset이 담김
- 예시: [hobby1, hobby2, hobby3, ...]
역참조(Hobby -> User)
# Hobby 모델의 name 필드 옵션이 related_name = users 일 때
hobby = Hobby.objects.get(name="영화관람")
users = hobby.users.all()
<ERD 식별, 비식별 관계>
- 식별 관계
- Article 모델의 Author에 primary_key=True 속성이 들어간 경우
- ForeignKey이자 pk값이면 식별 관계
- 유저가 탈퇴한 경우 유저 데이터만 삭제하고 게시글만 남길 수가 없음
- pk 필드이기 때문에 author를 비울 수가 없음
- 비식별 관계
- Article 모델이 별도의 pk를 가지고 있을 경우
- id가 pk인 경우
- 유저가 탈퇴한 경우 유저 데이터만 삭제하고 게시글을 남기고 싶은 경우에 author 필드를 null로 둘 수 있음(on_delete=models.SET_NULL 로 해야 함)
<시리얼라이저 실행 순서>
<데이터베이스 마이그레이션>
- 데이터베이스 종류
- Mysql
- Maria
- Postgresql(무료..!)
- 배포하고 싶을 때 사용함
- 개발할 때 사용했던 데이터를 옮기고 싶을 때
- A 데이터베이스에서 B 데이터베이스로 옮기고 싶을 때
- dumpdata
python -Xutf8 manage.py dumpdata --natural-primary --natural-foreign --exclude=contenttypes --exclude=auth --exclude=admin.logentry --exclude=sessions.session --indent 4 > <데이터를 담을 json 파일 이름>
python manage.py loaddata <데이터가 들어있는 json 파일 이름>
- <데이터를 담을 json 파일 이름> = <데이터가 들어있는 json 파일 이름>
- data.json 정도로 이름 지으면 됨
- 명령어 쓸 때 뒤에 .json도 붙여줘야 함