Back-End

[Django] 모델(Model), 커스텀 모델

NIMHO 2023. 5. 7. 19:05
728x90

모델(Model)

모델링

저장하고자 하는 데이터를 모델로 정의하는 것이다.

게시물 같은 경우에는 사진, 내용, 작성자, 작성일 등이 하나로 모여 게시물이 된다.

이를 모델링이라고 한다.

 

장고 모델

뷰(view) 함수에서 데이터 베이스에 어떤 작업을 요청할 때는 SQL 구문이 필요하다.

하지만 장고에는 내장 ORM이 있어서, SQL을 직접 작성하지 않아도 데이터베이스로 접근이 가능하다.

 

모델 정의

인스타그램처럼 게시물을 작성할 수 있게 모델을 구현해 보겠다.

기본적으로 프로젝트를 생성하듯이 프로젝트를 하나 생성해 준다.

그다음에 원하는 앱을 생성해 주면 된다.

게시물을 만들 예정이라서 posts로 만들어주었다. (settings.py에 등록해주어야 한다.)

django-admin startapp posts

 

Post 모델 정의

생성한 app에 있는 models.py에 모델의 구조와 타입을 설정해 준다.

from django.db import models


class Post(models.Model):
    image = models.ImageField(verbose_name='이미지', null=True, blank=True)
    content = models.TextField(verbose_name='내용')
    created_at = models.DateTimeField(verbose_name='작성일', auto_now_add=True)
    view_count = models.IntegerField(verbose_name='조회수', default=0)

사진, 내용, 작성일, 조회수를 먼저 넣어주었다.

verbost_name은 필드에 대한 이름을 지정해 주는 것이다.

정의를 해주었으면 shell에서 migrations, migrate를 실행해주어야 한다.

python manage.py makemigrations
python manage.py migrate

 

아래와 같이 migration 폴더에 생성이 된다.

# Generated by Django 4.2 on 2023-05-07 06:22

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Post',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('image', models.ImageField(upload_to='', verbose_name='이미지')),
                ('content', models.TextField(verbose_name='내용')),
                ('created_at', models.DateTimeField(verbose_name='작성일')),
                ('view_count', models.IntegerField(verbose_name='조회수')),
            ],
        ),
    ]
728x90

데이터베이스 접근 (SQLite)

데이터도 넣어보고 데이터베이스도 들어가 볼 수도 있다.

장고에서는 기본적으로 사용자 모델을 만들어준다.

python manage.py createsuperuser

username은 admin, emain은 엔터치고 넘어가면 된다.

 

그다음에 데이터베이스에 접근하려면 SQLite를 설치해 주면 된다.(vscode)

 

데이터베이스(db.sqlite3)를 우측 클릭 후 open database를 클릭해 준다

그러면 아래쪽에 SQLite Explorer가 생긴다.

여기서 원하는 데이터베이스를 열어서 정보를 볼 수 있다.

 

get_user_model (User 참조)

게시글을 작성할 때 작성자를 참조할 수 있는데, django에서 get_user_model을 제공해 준다.

from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()

class Post(models.Model):
    image = models.ImageField(verbose_name='이미지', null=True, blank=True)
    content = models.TextField(verbose_name='내용')
    created_at = models.DateTimeField(verbose_name='작성일', auto_now_add=True)
    view_count = models.IntegerField(verbose_name='조회수', default=0)
    writer = models.ForeignKey(to=User, on_delete=models.CASCADE, null=True, blank=True)

외부 참조 하는 models.ForignKey를 이용하면 User 참조가 가능해진다.

 

Comment 모델 정의

이것처럼 댓글을 작성하는 부분도 모델로 구현해 보았다.

class Comment(models.Model):
    content = models.TextField(verbose_name='내용')
    created_at = models.DateTimeField(verbose_name='작성일', auto_now_add=True)
    post = models.ForeignKey(to='Post', on_delete=models.CASCADE)
    writer = models.ForeignKey(to=User, on_delete=models.CASCADE, null=True, blank=True)

내용, 작성일, 작성자는 동일하다.

post는 외부키로 게시글을 받아온다.

해당 게시글 아래에 댓글을 달 수 있기 때문이다.

on_delete=models.CASCADE는 게시글이 삭제되면 아래에 댓글도 모두 삭제가 되는 코드이다.

 

똑같이 migration과 migrate를 하면 데이터베이스가 업데이트된다.

 

Post 모델 생성해 보기

아래 코드를 입력하면 shell로 접속할 수 있다.

python manage.py shell

shell에서 python코드를 입력해 주면 간단하게 post를 생성할 수 있다.

from posts.models import Post
Post.objects.create(content='shell을 통한 데이터 생성')
Post.objects.all()

데이터 베이스를 오픈하면 해당 데이터가 저장된 것을 확인할 수 있다.

 

주요 Field Option

null : DB 필드에 NULL 허용 여부

unique : 유일성 여부

black : 입력값 유효성 검사 시에 empty값 허용 여부

default : 디폴트 값 지정

verbose_name : 필드 레이블

validators : 입력값 유효성 검사를 수행할 함수를 지정

 

등 다양한 옵션이 존재한다.

728x90