[Django] Create Endpoint(3); sign-up, log-in, comments


app을 만들고 프로젝트에 연결까지 시켰다.
이제 app의 기능을 구현할 차례다.

[App 만드는 순서]
models.py ⇒ views.py ⇒ urls.py
  • models.py : 테이블 생성. data를 담을 주머니를 만든다.
  • views.py : 로직. 데이터 넣고 저장하고 보내고 등등 데이터랑 일한다.
  • urls.py : request를 받으면 연결연결해서, 이걸 처리할 수 있는 endpoint까지 보낸다.

models.py에서 class, table 만들기

#app_name/models.py

from django.db import models

class User(models.Model):
    name       = models.CharField(max_length = 50)
    email      = models.CharField(max_length = 200)
    phone      = models.CharField(max_length = 30)
    password   = models.CharField(max_length = 500)
    created_at = models.DataTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)
    
    class Meta:
        db_table = 'users'   #없어도 상관없는. 편리함을 위해 테이블 이름을 정해주는 역할
  • class명은 단수로, 첫글자는 대문자로 정한다.
    table명은 복수로, 소문자를 사용한다.
  • auto_now_add는 최초로 추가되었을 때만 시간이 입력된다.
    auto_now는 내용이 변경될 때마다 시간이 입력된다.
  • class Meta 는 meta 데이터로, 옵션값이다. 여기에서의 역할은 그냥 테이블 이름만 정해준다.
    테이블 이름을 정해주지 않으면 장고에서 자동으로 app_app과 같은 형식으로 지정한다.

    Meta data : 대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 일정한 규칙에 따라 콘텐츠에 대하여 부여되는 데이터이다. 어떤 데이터 즉 구조화된 정보를 분석, 분류하고 부가적 정보를 추가하기 위해 그 데이터 뒤에 함께 따라가는 정보를 말한다.

  • coding convention: 가독성을 위해서 data들을 줄맞춤 해준다.

****만약에 모델 클래스에 id라는 걸 사용하면 어찌되나?
****Meta에 db_table이라는 단어도 딱 저렇게 사용해야되나?

makemigrations, migrate

  • models.py의 내용을 수정했다면 무조건 migrate를 해줘야 적용이 된다. 거기까지 해야 테이블이 만들어진다.
  • makemigrations는 일단 이렇게 만들 것이라고 미리 보여주는 것. 테이블을 생성하려면 꼭 migrate까지 해줘야한다.
  • app의 이름을 넣어주는 것이 좋다. 다 완성된 게 아닌데 전체를 해버리면 에러가 날 수도 있다.
$ python manage.py makemigrations (app_name)

Migrations for 'user':
    user/migrations/0001_initial.py
    - Create model Userlcd
  • 여기에서 migration이 어떻게 만들어졌는지 자세히 보고 싶다면, 위에 나온 경로를 열면 된다.

    • 열어보면, fields에 내가 넣지 않은 정보 ‘id’가 있는 걸 확인할 수 있다.
      여기서 id는 고유의 primary key를 말하는데, 이건 django에서 자동으로 생성해준다.
    • database에 있는 data를 삭제해도 primary key는 바뀌지 않고, 삭제된 data의 primary key에 새로운 data가 들어가지는 않는다. data가 쌓이면 그냥 primary key가 늘어 난다.
$ cat user/migrations/0001_initial.py

# Generated by Django 3.0.3 on 2020-02-07 04:56

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='User',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=50)),
                ('email', models.CharField(max_length=200)),
                ('phone', models.CharField(max_length=30)),
                ('password', models.CharField(max_length=500)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
            ],
            options={
                'db_table': 'users',
            },
        ),
    ]

****python manage.py sqlmigrate account 0001 #번호 정할 수 있음. 이거랑 python manage.py migrate랑 뭐가 다른가?

  • makemigrations는 되어 있지만 아직 migrate 안 된 것들을 볼 수 있다.
    migrate까지 완료되면 [X] 라고 표시된다.

    $ python manage.py showmigrations
    
    contenttypes
        [ ] 0001_initial
        [ ] 0002_remove_content_type_name
    sessions
        [ ] 0001_initial
    user
        [ ] 0001_initial
  • migrate까지 완료하면 table이 만들어진다.

    python manage.py migrate (app_name)
  • sqlite3 db.sqlite3.tables : table이 잘 생성됐는지 확인한다.
    (sqlite3은 django에서 기본으로 제공하는 database)

    table에 내가 만든 users가 생겼다.
    나머지 3개는 django가 필요해서 만든 table들이며, django가 만든 것들은 앞에 ‘django’라고 붙는다.

    sqlite3를 끝내려면 ctrl + d (ctrl + c는 break)

    $ sqlite3 db.sqlite3 
    
    SQLite version 3.31.1 2020-01-27 19:55:54
    Enter ".help" for usage hints.
    sqlite> **.tables**
    django_content_type  django_session     
    django_migrations    **users**