[Django] DAY13. 데이터베이스 모델링하기 : User, Post, Comment

이하얀·2024년 2월 13일
0

2024년 2월 13일 화요일

📙 강의 내용 요약

  1. user와 board 앱 생성
python3 manage.py startapp user
python3 manage.py startapp board

  1. user 모델 생성
  • user/models.py에 해당 내용 추가
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    nickname = models.CharField(max_length=30)

    class Meta:
        db_table="user"
  • 사용자 정보를 커스텀하고 싶을 경우

    • AbstractBaseUser를 사용할 수 있으나, 커스텀을 어디까지 하느냐에 따라서 더 복잡해질 수 있기 때문에 현 단계에서는 사용 지양

      from django.contrib.auth.models import AbstractUser, AbstractBaseUser
      //그 아래 내용 추가
  • user 모델이 생겼다는 것을 알려주기

    anonymous/settings.py

    //INSTALLED_APPS에 다음 내용 추가
    'user',
    'board',
    
    // 새로운 변수 생성
    AUTH_USER_MODEL = 'user.User'
  • 확인

    python3 manage.py makemigrations
    • 에러 : settings.py를 저장하지 않고 마이그레이션해 생긴 문제

    • 해결

    • 0001_initial.py 생성 완료됨.

  • 마이그레이션 확인
    - DBeaver에서 Tables 안의 모든 테이블 shift로 전체 선택 → 삭제 → Cascade delete

  • 다시 마이그레이션

python3 [manage.py](http://manage.py/) migrate

  • 다시 DBeaver에서 추가되었는지 확인

  • user에 추가한 nickname도 잘 반영되어 있음을 확인

  • AbstractUser

    • django 기본 유저 모델
    • (이것저것 많이 포함되어 있음, 각종 필드, 각종 함수(유저생성, 유저인증 등등))
  • AbstractBaseUser

    • django 최소 유저 모델
      (필드:비밀번호, 마지막로그인, 활성여부 3가지만 존재, 최소한의 함수만 존재)
    • 따라서, 로그인 시 필요한 필드 등 많은 부분 커스텀 가능
    • 하지만, 장고의 유저 관련 함수들을 직접 정의하여 사용해야 함.
  • board > models.py
    from django.db import models
    from user.models import User
    
    class Post(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE) # CASCADE: 유저 탈퇴 시 게시글 삭제 옵션 | SET_NULL, null=True: 유저 탈퇴해도 게시글은 유지(작성자는 알수 없게 됨.)
        title = models.CharField(max_length=100)
        content = models.TextField()
        reg_date = models.DateTimeField(auto_now_add=True) # auto_now_add: 게시글이 최초로 업로드된 시간을 저장하겠다는 의미
        img_url = models.URLField(null=True)
    
        class Meta:
            # 만약 테이블 이름을 지정하지 않으면 app이름_Model이름 으로 테이블이 작성됨(Ex. board_post)
            db_table="post"
    
    class Comment(models.Model):
        post = models.ForeignKey(Post, on_delete=models.CASCADE)
        content = models.TextField
        reg_date = models.DateTimeField(auto_now_add=True)
    
        class Meta:
            db_table="comment"
  • 추가된 내용을 반영해야하니, 다시 마이그레이션 진행
    ```python
    python3 manage.py makemigrations
    ```
python3 manage.py migrate


♻️ 느낀점&인사이트

오늘은 실제로 django 환경에서 어떻게 모델을 만드는지에 대한 강의를 듣게 되었다.

익명 게시판을 주제로 한 프로젝트를 진행하기 때문에, 사용자와 관련된 user 모델, 글을 업로드하는 것과 관련된 board 모델을 생성했다.

특히 user 모델의 경우 기본 모델인 AbstractUser와 커스텀이 가능한 AbstractBaseUser를 상속받아 작성하는 점이 흥미로웠다.

그동안 Spring을 쓰며 JPA를 쓰기는 했지만, 모든 테이블의 칼럼 이름과 조건은 엔티티를 통해 명시해줘야만 했다.

그런데 django에서는 유저 기본 테이블에 한정적이기는 하나, 상속받아서 추가할 칼럼만 작성해주면 합쳐지면서 편리하게 사용하는 방법도 있다는 것을 알게 되어 매우 흥미로웠다.

이렇게 프레임워크 간 차이점을 코딩하며 느끼니 더 재미있게 느껴지는 것 같다.

그리고, 오늘 강의를 통해 앞으로도 익명 게시판을 만들며 왜 이런 코드를 작성하고 조건을 다르게 바꾸면 어떻게 바뀌는 현상이 발생하는지에 대해 고민하겠다고 마음먹게 되었다.

남은 기간동안 더 화이팅하자!

profile
언젠가 내 코드로 세상에 기여할 수 있도록, BE&Data Science 개발 기록 노트☘️

0개의 댓글