*** ## Double Under Score 관련된 모델의 필드를 조회할 때 사용한다. 여러 객체를 포함하는 쿼리셋에 필터링하거나 정렬할 때 사용한다. **예시 코드** * **정렬** ```python videos = Video.objects.all().order_by('channel__owner') ``` * **필터링** ```python videos = Video.objects.filter(channel__owner=request.user) ``` *** ## Field Data Type ### 1. Integer Fields 1) `IntergerField` * **특징** 2) `BigIntegerField` * **특징** 3) `PostiveIntegerfield` * **특징** 1. 양의 정수만을 저장하는 필드 2. **비교적** 작은 범위의 양수 값을 저장. (최대 2,147,483,647) 3. 데이터베이스에 `int`로 저장 4) `PostiveBigIntegerField` * **특징** 1. 양의 정수만을 저장하는 필드 2. **비교적** 큰 범위의 양수 값을 저장. (최대 9,2237,2036,8547,7000) 3. 데이터베이스에 `bigint`로 저장 ### 2. Char and Text Fields 1) `CharField` * **특징** 1. 길이가 제한된 문자열을 저장 2) `TextField` * **특징** 1. 길이 제한이 없는 문자열을 저장 ### 3. Boolean Fields 1) `BooleanField` * **특징** 1. True 또는 False 값을 저장 2) `NullBooleanField` * **특징** 1. True, False, 또는 None 값을 저장 ### 4. Date and Time Fields 1) `DateTimeField` * **저장하는 값**: 날짜와 시간을 모두 저장합니다. * **데이터베이스 저장 형식**: `YYYY-MM-DD-HH:MM:SS` * **옵션** * `auto_now`: `True`. 객체가 저장될 때마다 해당 필드가 자동으로 현재시간으로 업데이트 * `auto_now_add`: `True`. 객체가 처음 생성될 때 현재 시간으로 설정. 이후에는 수정 안됨 2) `DateField` * **저장하는 값**: 날짜만 저장한다. 시간 정보는 제외 * **데이터베이스 저장 형식**: `YYYY-MM-DD` * **옵션** * `auto_now`: `True`. 객체가 저장될 때마다 해당 필드가 자동으로 현재시간으로 업데이트 * `auto_now_add`: `True`. 객체가 처음 생성될 때 현재 시간으로 설정. 이후에는 수정 안됨 *** ## ForeignKey ### options `related_name` * **설명** * 기본적으로 'ForeignKey'와 같은 관계를 정의할 때, 반대 모델에서 관계를 역방향 참조를 할 수 있는데 이를 위한 속성을 자동생성한다. 기본적으로 `<related_model>_set`과 같이 뒤에 `_set`이 붙여서 속성을 사용할 수 있는데 이를 커스터마이징을 할 수 있게 해준다. * **기능** * 역방향 참조 시 해당 속성의 커스터마이징 * **예시 코드** * *설정 안했을 때* ```python owner = models.ForeignKey('auth.User', on_delete=models.CASCADE) objects = User.snippets_set.all() ``` * *설정 했을 때* ```python owner = models.ForeignKey('auth.User', related_name='snippets' on_delete=models.CASCADE) objects = User.snippets.all() ``` *** ## Meta ### Options * `ordering` * **기능**: 이 옵션을 설정하면, 해당 모델의 모든 쿼리셋이 기본적으로 지정된 순서에 따라 정렬된다. * **예시**:`ordering=['created'] * `constraints`: 해당 모델에 적용되는 제약 조건을 명시한다. * `UniqueConstraint`: "고유성"과 관련된 클래스 * **예시** ```python constraints = [UniqueConstraint(field=['owner'], name='unique_owner_channel')] ``` * **주의** * Django의 예전 버전에서는 `unique_together = ('subscriber', 'channel')`와 같이 사용하는 경우가 있었으나 버전이 올라가면서 `UniqueConstraint` 로 대체 * `CheckConstraint`: 필드에 기입된 데이터 값에 대한 조건 설정과 관련된 클래스 * **관련 궁금증** 1. 제약 조건 클래스 속성 값에 `name` 속성은 중요할까? - 실제 데이터베이스에서 사용될 제약 조건의 이름이며, 제약 조건에 오류가 발생하면 그 의미를 쉽게 파악할 수 있다. 또한, 수동으로 해당 제약조건을 SQL로 삭제할 때 사용될 수도 있다. - 해당 제약 조건의 이름을 고유해야하며 데이터베이스 종류에 따라서 이름의 길이가 제한될 수 있다. *** ## Method * `save` ^9e95a5 * **호출 시점**: 특정 모델의 인스턴스를 데이터베이스에 저장하거나 업데이터할 때 호출 * **사용 목적**: * 데이터베이스에 데이터를 저장하기 전에 검증 또는 데이터 변경 작업이 필요할 때 사용 * 기본 동작을 확장하거나 변경하는데 사용 * **주요 인자** * `force_insert` * 기본적으로 이미 존재하는 객체에는 `UPDATE`, 존재하지 않는 객체에는 `INSERT`를 수행한다. 이 인자를 `True`설정하면 항상 `INSERT` 쿼리를 실행한다. * `force_update` * 이 인자를 `True` 설정하면, 항상 `UPDATE` 쿼리를 실행한다. 만약 해당 쿼리를 적용시킬 객체가 없다면 예외가 발생한다. * `update_fields` * 특정 필드만 업데이트하고 싶을 때 사용합니다. * `delete` *** ## 링크 [django doc](https://docs.djangoproject.com/en/5.0/ref/models/options/) ***