<commit_before>---
layout: post
title: Day22 - Django Doc | Introduction to models
categories: wps
tags: [fastcampus, python, django, code]
---

## 프로젝트 설정

```shell
# pyenv local 설정 해제하는 법
$ rm -rf .python-version

# .gitignore 파일 복사
$ cp ~/fastcampus/projects/django_girls_class/.gitignore .

# 소스파일설정하기
# 모델 작성
# 세팅에 INSTALLED_APP 앱 추가
# migrate
# createsuperuser
```



```shell
>>> from person.models import Person
>>> p = Person(name='hm', shirt_size='M')
>>> p.save()
>>> p.shirt_size
'M'

In [1]: from person.models import Person

In [3]: p = Person.objects.get(id=1)

In [4]: p.shirt_size
Out[4]: 'M'

In [6]: p.get_shirt_size_display()
Out[6]: 'Medium'

In [7]: p.shirt_size = 'ohter'

In [8]: p.save()

In [9]: p.get_shirt_size_display()
Out[9]: 'ohter'
```



```shell
In [28]: Person.objects.all()
Out[28]: <QuerySet [<Person: Person object>]>

In [26]: Person.objects.values_list()
Out[26]: <QuerySet [(1, 'hm', 'M')]>

In [29]: Person.objects.values_list('name', flat=True)
Out[29]: <QuerySet ['hm']>

In [32]: Person.objects.all()
Out[32]: <QuerySet [<Person: Person object>, <Person: Person object>]>

In [31]: Person.objects.values_list()
Out[31]: <QuerySet [(1, 'hm', 'M'), (2, 'na', 'M')]>

In [30]: Person.objects.values_list('name', flat=True)
Out[30]: <QuerySet ['hm', 'na']>
```



# [Models](https://docs.djangoproject.com/en/1.10/topics/db/models/)

모델은 데이터 정보의 소스이다. 일반적으로 각 모델은 하나의 데이터베이스 테이블과 연결한다.

기본 사항:

- 각 모델은 `django.db.models.Model`의 서브클래스인 파이썬 클래스이다.
- 모델의 각 **속성은 데이터베이스 필드**로 표현한다.
- 장고는 자동으로 생성한 데이터베이스 접근 API(ORM)를 제공한다. 쿼리를 만들어 볼 수 있다.

## Quick example

모델 예는 `first_name`과 `last_name`을 가지는 `Person`을 정의한다.

```python
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
```

`first_name`과 `last_name`은 **모델의 필드**이다. 각 필드는 클래스 속성으로 지정하고, 각 속성은 데이터베이스 column과 연결된다.

위의 `Person`모델은 아래와 같은 데이터베이스를 만든다.

```sql
CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);
```



- 테이블 이름

  - 장고는 자동적으로 '모델 클래스의 이름'과 '앱 이름'에서 데이터베이스 테이블 이름을 얻는다.
  - 위의 예에서 테이블 이름은 `myapp_person`이다.

- id 필드는 자동으로 추가된다. (override 불가)

  ​

## Using models

모델을 정의하자마자 그 모델을 *사용*할 것이라고 장고에게 알려야 한다. 장고에게 알리는 것은 설정 파일  `INSTALLED_APPS`에 추가하면 된다.

```python
INSTALLED_APPS = [
    #...
    'myapp',
    #...
]
```

`INSTALLED_APPS`에 새로운 앱을 추가한 후, `manage.py migrate`를 실행해야 한다.

## Fields

모델의 유일한 필수 부분이자, 가장 중요한 부분은 필드가 정의한 데이터베이스 리스트이다. 필드는 클래스 속성에 의해 지정된다.  clean, save, delete 같은 `models API`와 충돌하는 필드 이름을 고르지 않도록 주의하자.

### Field types

모델의 각 필드는 적절한 `Field` 클래스의 하나의 인스턴스여야 한다. 장고는 필드 클래스 유형을 사용하여 몇 가지를 결정한다.

-  column type : 데이터베이스에 저장할 데이터 종류 (예: `INTEGER` , `VARCHAR` , `TEXT` )
-  **폼 필드**를 렌더링할 때, 사용할 기본 HTML `widget` (widget = 장고 내의 HTML input element, 예: choice 선택박스를 만들어줌)
-  장고 관리자 안에서 요구된 최소한의 검증

Django에는 수십 가지 내장 필드 타입이 있다. [model field reference](https://docs.djangoproject.com/en/1.10/ref/models/fields/#model-field-types)에서 전체 목록을 찾을 수 있다. 또한, 커스텀 모델 필드를 쉽게 만들수 있다.

### Field options

각 필드는 필드 별 인자 세트를 갖는다. 예를 들면, `CharField`는 `VARCHAR`의 사이즈를 지정하는 `max_length` 인자가 필요하다.

또한 모든 필드 타입으로 사용할 수 있는 공통 인자 세트가 있다. 모든 것은 옵션이다. 가장 자주 사용하는것만 요약해보자.

#### null

`True`면, 데이터베이스는 `NULL`이라는 빈 값을 데이터베이스에 저장할 것 이다. (Default `False`)

#### blank

`True` 면, 필드는 공백을 허용한다. (Default `False`)

**주의** : `null`과는 다르다. `null`은 순전히 데이터베이스 관련인 반면, `blank`는 유효성과 관련이다.

#### choices

필드의 choices로 사용할 2차원 튜플을 반복 가능한 (예 : list 또는 tuple) 객체에 담아 주면, 기본 폼 위젯은 문자 필드 대신 선택 상자(select box)가되어 주어진 선택 사항으로 선택 항목을 제한한다. (admin 페이지에서 확인 할 수 있다.)

```python
from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
```

각 튜플의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 폼 위젯 또는 `ModelChoiceField` 에 의해 표시된다. 모델 인스턴스가 주어지면, choices 필드를 위한 표시 값은 `get_FOO_display()` 메서드를 사용해 에 접근할 수 있다.

```shell
>>> p = Person(name="<NAME>", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
```



#### default

기본 값을 위한 필드이다. 값 또는 호출가능한 객체면 가능하다. 만약 호출하는 경우라면, 새로운 객체가 생성될 때 마다 호출된다.

```python
from django.db import models


class Person(models.Model):
    SHIRT_SIZES = [
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),<commit_msg>fixed typo<commit_after>---
layout: post
title: Day22 - Django Doc | Introduction to models
categories: wps
tags: [fastcampus, python, django, code]
---

## 프로젝트 설정

```shell
# pyenv local 설정 해제하는 법
$ rm -rf .python-version

# .gitignore 파일 복사
$ cp ~/fastcampus/projects/django_girls_class/.gitignore .

# 소스파일설정하기
# 모델 작성
# 세팅에 INSTALLED_APP 앱 추가
# migrate
# createsuperuser
```



```shell
>>> from person.models import Person
>>> p = Person(name='hm', shirt_size='M')
>>> p.save()
>>> p.shirt_size
'M'

In [1]: from person.models import Person

In [3]: p = Person.objects.get(id=1)

In [4]: p.shirt_size
Out[4]: 'M'

In [6]: p.get_shirt_size_display()
Out[6]: 'Medium'

In [7]: p.shirt_size = 'ohter'

In [8]: p.save()

In [9]: p.get_shirt_size_display()
Out[9]: 'ohter'
```



```shell
In [28]: Person.objects.all()
Out[28]: <QuerySet [<Person: Person object>]>

In [26]: Person.objects.values_list()
Out[26]: <QuerySet [(1, 'hm', 'M')]>

In [29]: Person.objects.values_list('name', flat=True)
Out[29]: <QuerySet ['hm']>

In [32]: Person.objects.all()
Out[32]: <QuerySet [<Person: Person object>, <Person: Person object>]>

In [31]: Person.objects.values_list()
Out[31]: <QuerySet [(1, 'hm', 'M'), (2, 'na', 'M')]>

In [30]: Person.objects.values_list('name', flat=True)
Out[30]: <QuerySet ['hm', 'na']>
```



# [Models](https://docs.djangoproject.com/en/1.10/topics/db/models/)

모델은 데이터 정보의 소스이다. 일반적으로 각 모델은 하나의 데이터베이스 테이블과 연결한다.

기본 사항:

- 각 모델은 `django.db.models.Model`의 서브클래스인 파이썬 클래스이다.
- 모델의 각 **속성은 데이터베이스 필드**로 표현한다.
- 장고는 자동으로 생성한 데이터베이스 접근 API(ORM)를 제공한다. 쿼리를 만들어 볼 수 있다.

## Quick example

모델 예는 `first_name`과 `last_name`을 가지는 `Person`을 정의한다.

```python
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
```

`first_name`과 `last_name`은 **모델의 필드**이다. 각 필드는 클래스 속성으로 지정하고, 각 속성은 데이터베이스 column과 연결된다.

위의 `Person`모델은 아래와 같은 데이터베이스를 만든다.

```sql
CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);
```



- 테이블 이름

  - 장고는 자동적으로 '모델 클래스의 이름'과 '앱 이름'에서 데이터베이스 테이블 이름을 얻는다.
  - 위의 예에서 테이블 이름은 `myapp_person`이다.

- id 필드는 자동으로 추가된다. (override 불가)

  ​

## Using models

모델을 정의하자마자 그 모델을 *사용*할 것이라고 장고에게 알려야 한다. 장고에게 알리는 것은 설정 파일  `INSTALLED_APPS`에 추가하면 된다.

```python
INSTALLED_APPS = [
    #...
    'myapp',
    #...
]
```

`INSTALLED_APPS`에 새로운 앱을 추가한 후, `manage.py migrate`를 실행해야 한다.

## Fields

모델의 유일한 필수 부분이자, 가장 중요한 부분은 필드가 정의한 데이터베이스 리스트이다. 필드는 클래스 속성에 의해 지정된다.  clean, save, delete 같은 `models API`와 충돌하는 필드 이름을 고르지 않도록 주의하자.

### Field types

모델의 각 필드는 적절한 `Field` 클래스의 하나의 인스턴스여야 한다. 장고는 필드 클래스 유형을 사용하여 몇 가지를 결정한다.

-  column type : 데이터베이스에 저장할 데이터 종류 (예: `INTEGER` , `VARCHAR` , `TEXT` )
-  **폼 필드**를 렌더링할 때, 사용할 기본 HTML `widget` (widget = 장고 내의 HTML input element, 예: choice 선택박스를 만들어줌)
-  장고 관리자 안에서 요구된 최소한의 검증

Django에는 수십 가지 내장 필드 타입이 있다. [model field reference](https://docs.djangoproject.com/en/1.10/ref/models/fields/#model-field-types)에서 전체 목록을 찾을 수 있다. 또한, 커스텀 모델 필드를 쉽게 만들수 있다.

### Field options

각 필드는 필드 별 인자 세트를 갖는다. 예를 들면, `CharField`는 `VARCHAR`의 사이즈를 지정하는 `max_length` 인자가 필요하다.

또한 모든 필드 타입으로 사용할 수 있는 공통 인자 세트가 있다. 모든 것은 옵션이다. 가장 자주 사용하는것만 요약해보자.

#### null

`True`면, 데이터베이스는 `NULL`이라는 빈 값을 데이터베이스에 저장할 것 이다. (Default `False`)

#### blank

`True` 면, 필드는 공백을 허용한다. (Default `False`)

**주의** : `null`과는 다르다. `null`은 순전히 데이터베이스 관련인 반면, `blank`는 유효성과 관련이다.

#### choices

필드의 choices로 사용할 2차원 튜플을 반복 가능한 (예 : list 또는 tuple) 객체에 담아 주면, 기본 폼 위젯은 문자 필드 대신 선택 상자(select box)가되어 주어진 선택 사항으로 선택 항목을 제한한다. (admin 페이지에서 확인 할 수 있다.)

```python
from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
```

각 튜플의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 폼 위젯 또는 `ModelChoiceField` 에 의해 표시된다. 모델 인스턴스가 주어지면, choices 필드를 위한 표시 값은 `get_FOO_display()` 메서드를 사용해 choices 값에 접근할 수 있다.

```shell
>>> p = Person(name="<NAME>", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
```



#### default

기본 값을 위한 필드이다. 값 또는 호출가능한 객체면 가능하다. 만약 호출하는 경우라면, 새로운 객체가 생성될 때 마다 호출된다.

```python
from django.db import models


class Person(models.Model):
    SHIRT_SIZES = [
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
{'fraction_non_alphanumeric': 0.1589492430988424, 'fraction_numerical': 0.012911843276936777, 'mean_word_length': 3.535588086824836, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 71, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2944484', 'n_tokens_mistral': 5403, 'n_tokens_neox': 6333, 'n_words': 1185}