상속모델 클래스 하나가 테이블 하나에 대응
필드의 속성 하나가 db의 컬럼에 대응.
필드
필드 타입
필드를 지정함으로써 설정되는 것.
1. 종류
2. 폼에서 렌더링 될 때의 위젯 타입
3. 최소한의 검증방법.
장고에는 기본 필드종류가 많다. https://docs.djangoproject.com/en/4.2/ref/models/fields/#model-field-types에서 모든 종류를 확인할 수 있고, https://docs.djangoproject.com/en/4.2/howto/custom-model-fields/에서 커스텀 모델 필드를 만드는 방법을 찾아볼 수 있다.
필드 옵션
null: db에 NULL 입력을 허용할 것인지
blank: form에서 is_valid()를 수행할 때 공백도 허용할 것인지.
null이 db관련이라면, blank는 validation, form 관련이다.
choices
CHOICE = [(2023, "2023년"), (2022, "2022년"), (2021, "2021년")]
형식으로 사용되며, (2023, "2023년")에서 2023은 DB에 저장되는 부분, "2023년"은 form에서 보여주는 부분이다.
choices에 대한 자세한 정보는https://docs.djangoproject.com/en/4.2/ref/models/fields/#field-choices에서 확인하자.
default: 기본으로 입력될 내용. callable object도 가능하다네
help_text: form에서 도움줄 내용.
primary_key: True 안해도 기본으로 integer 형식으로 생성해줌. read-only로, 수정하면 새 개체가 생성됨.
unique: 테이블에 걸쳐서 중복되면 안됨.
더 자세한 내용은 https://docs.djangoproject.com/en/4.2/ref/models/fields/#common-model-field-options를 참고하자.
Verbose Field Name
필드 이름을 조금 더 자세하게 설명하기 위해 사용하는 부분. 필드 옵션의 첫번째에 입력하면 자동으로 반영됨. 입력하지 않으면 필드 이름에서 "_"를 제거해서 자동으로 생성해줌.
ForeignKey, ManyToMany, OneToOne은 verbose_name= 을 사용해서 지정할 수 있음.
관계
Many-to-One 관계
예를 들어서 차와 제작자의 관계가 있다. 차는 하나의 제작자만을 가지지만 제작자는 여러개의 차를 제작한다. 이게 Many-to-One 관계이다.
ForeignKey를 이용해서 나타내며, 필드 옵션에 관계시킬 모델 이름을 작성해야 한다.
재귀 관계와 아직 만들어지지 않은 db와의 관계도 지정할 수 있다고 한다. https://docs.djangoproject.com/en/4.2/ref/models/fields/#ref-foreignkey를 참고하자.
Many-to-many 관계
ForeignKey 필드와 거의 똑같다.
피자가 여러개의 토핑을 사용한다면 이 관계를 사용할 수 있다.
일반적으로 피자의 인스턴스에 ManyToManyField를 지정한다. 피자에 여러개의 토핑이 있다고 생각하는 것이 토핑이 여러개의 피자에 사용된다고 생각하는 것보다 자연스럽기 때문이다.
Many-to-many 관계의 추가 옵션
중개자를 추가할 수 있다.
예를 들어 음악가와 그룹이 있다. 음악가는 여러곳의 그룹에 속할 수 있고, 그룹은 여러명의 음악가를 포함한다. 이 둘 사이의 관계에서 그룹 가입 날짜, 가입 이유 등은 관계마다 다르다. 이때 중개자가 필요하게 된다.
자세한 예시는 공식 홈페이지 가서 다시 확인할 것.
One-to-One 관계
비슷하다.
어떤 것을 '확장'하려고 할 때 사용한다고 한다.
파일 간의 모델
다른 파일에 있어도 import 하기만 하면 모델을 얼마든지 쓸 수 있다.
궁금한건 파일을 import 해야 하는지, 아니면 from 파일에서 모델을 import 해야 하는지다.
예상컨데 파일을 import 하면 파일명.model 처럼 사용해야 할 것이다. 따라서 후자의 방식을 사용하지 않을까?
필드 이름제한
1. 파이썬에서 예약한 이름 불가
2. 언더바 두개 불가. 장고 쿼리의 작동 방식 때문.
3. 언더바로 끝나는 이름불가.
항상 그렇지는 않음. db_column을 통해 db에 저장될 이름을 설정할 수 있기 때문.
sql에서 금지된 단어도 사용할 수 있긴 함. 이름을 바꿔준다나.
커스텀 필드
전화번호 필드처럼 원하는 필드를 만들 수도 있음. https://docs.djangoproject.com/en/4.2/howto/custom-model-fields/ 이 how-to 가이드를 참고하자.
Meta 옵션
참고할 테이블 이름, 정렬 방법, 포함시킬 앱 이름, 복수형 이름 등을 설정할 수 있다.
필드 외의 모든 것이 Meta에 속한다고 이해하면 된다.
모델 속성
모델의 가장 중요한 속성은 Manager이다.
쿼리에서 db를 조작할 때 사용되는 건가 보다. 기본 이름은 objects이다.
메니저에 대한 정보는 https://docs.djangoproject.com/en/4.2/topics/db/managers/#django.db.models.Manager에서,
쿼리에 대한 정보는 https://docs.djangoproject.com/en/4.2/topics/db/queries/에서 찾아보라.
모델 메소드
모델과 관련된 자동 메소드를 구현할 수 있다.
예를 들어, 성과 이름이 따로 분리되어 저장되어 있다면, 이 둘을 묶어서 리턴하는 메소드를 만들 수 있다.
자주 쓰이는 메소드에는
__str__()
get_absoulte_url()이 있다.
기본 모델 메소드 오버라이딩
save()와 같은 메소드를 오버라이딩 해서 추가 인자를 넣어서 save할 수 있다.
잘 이해가 안되는 부분이다.
모델 상속
세가지 경우가 있다.
1. 부모 모델을 사용 안할 경우. 자녀 모델에 똑같은 내용 쓰기 귀찮은 경우가 해당된다. Abstract base classes
2. 이미 있는 테이블을 상속하고 싶은 경우. Multi-table inheritance
3. 파이썬 관련 기능만 상속하고 싶은 경우. Proxy-model
Abstract base classes
Meta에 Abstract=True 라고 작성함으로써 추상 베이스 클래스가 된다.
괄호에 베이스 클래스를 씀으로써 상속받는다.
부모 클래스에 있는 모든 속성을 전달받는다.
Meta 클래스 상속도 가능하다.
여러 종류의 모델로부터 상속도 가능한데, Meta는 첫번째 인자의 정보만 가져온다.
따라서 자녀 클래스에 추가 정보를 입력하려고 하지 않아도 두 부모 클래스의 Meta를 명식적으로 나타내야 한다.
related_name, related_query_name 사용시 주의
foreign_key, manyToMany 필드가 포함된 모델을 상속받을 때 주의해야 한다는 내용이다.
아마 관계가 있는 모델마다 필드를 구분하기 위해 위 두가지 옵션을 사용하는 것 같은데, 부모와 자녀의 필드 이름이 같으면 관계 상에 오류가 생기는 것이다.
따라서 %(app_label)s, %(class)s 를 사용해서 앱, 클래스마다 이름을 바꿔줘야 한다.
안 그러면 migrate 할 때 오류를 띄워준다.
Multi-table Inheritance
부모 클래스도 테이블을 가진 상태에서 상속하는 경우다.
multi-table 상속을 하는 경우 장고가 자동으로 oneToOne 관계를 생성해준다.
자녀 클래스와 부모 클래스에 같은 정보가 있다면, 부모 클래스 오브젝트를 통해 자녀 클래스에 접근할 수 있다.
하지만 부모 클래스에만 있는 정보라면 접근이 힘들다.
만약 link를 원하지 않는다면 오버라이딩으로 설정 해제를 할 수도 있다.
Meta 상속
기본적으로는 상속하지 않는다.
예외가 있는데, 자녀 클래스에 order이나 get_latest_by가 설정되어 있지 않다면 상속 받는다.
상속받길 원치 않는다면 각 변수의 속성을 비우면 된다.
상속과 관계 설정을 동시에 하는 경우
혼동을 방지하기 위해 related_name을 사용해 주어야 한다.
Proxy-model
부모 클래스와 완전히 동일하면서 새로운 함수같은 것만 추가하고 싶을 때 사용한다.
자녀 클래스의 Meta에 Proxy=True라고 설정하면 된다.
프록시 모델에서는 부모 클래스의 오브젝트에 접근할 수 있다. 두개가 완전히 동일하기 때문이다.
요청한 곳에 해당하는 모델을 수정한다.
부모 클래스에서 수정한 것은 부모 클래스에만 적용된다~ 그런 이야기 같다.
상속 제약
정상 모델(non-abstract) 하나만 상속 받을 수 있다. 반면 추상 모델, 프록시 모델은 여러개를 상속받을 수 있다고 한다...?
Manager
기본적으로 부모의 매니저를 상속받지만, 원한다면 새롭게 정의할 수도 있다.
Meta.manage=False인 모델과 프록시 모델의 차이
전자는 table을 동기화하기 힘들지만
프록시는 항상 동일하다는 차이가 있다.
잘 이해가 안됐다.
다중 상속
파이썬에서 되듯, 장고에서도 된다.
주의할 점은 primary-key의 중복이다. 기본 id 컬럼이 중복될 수 있다.AutoField 옵션의 primary key를 지정해서 충돌 안나게 하자.
예시에서는 Multi-table 상속을 가정하고 있는 것 같다.
'웹개발' 카테고리의 다른 글
django form (0) | 2023.05.05 |
---|---|
cafe24 jdbc 연결 (0) | 2023.02.22 |
jsp 폼에서 서블릿 호출 안되는 문제 (0) | 2023.02.19 |
댓글