***
## 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/)
***