Django - 실습편 model (2)

아카이브 · 2021. 6. 8. 15:18

추상모델(abstract model)

기본 자주사용하는 컬럼들을 정리해서 Base 추상 모델 생성

from django.db import models


class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True, blank=True, null=True, verbose_name="생성일")
    updated_at = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="수정일")

    class Meta:
        abstract = True

 

아래와 같이 상속 받아서 모델 생성

 

AbstractUser은 장고에서 기본적으로 제공해주는 유저모델임

- user_index 장고는 기본키로 id를 primary_key로 생성해줌 그 키를 사용하지 않고 user_index를 primary_key로 사용

- USERNAME_FIELD는 장고에서 기본적으로 디폴트로 username키를 사용하는데 해당 키를 user_id로 변경하겠다는 내용

 

- app_label은  아래와 같이 라벨을 정의해놓으면 user = apps.get_model("user", "User")와 같이 모델을 호출할수 있음

- db_table은 테이블의 별칭을 user로 지정하겠다는 의미

 

class User(AbstractUser, BaseModel):
    user_index = models.AutoField(primary_key=True, verbose_name="회원번호")
    user_id = models.CharField(max_length=20, verbose_name="로그인ID", unique=True)
    password = models.CharField(max_length=120, verbose_name="로그인PWD")
    username = models.CharField(max_length=20, blank=True, null=True, verbose_name="회원이름")

    USERNAME_FIELD = 'user_id'

    class Meta:
        db_table = "user"
        verbose_name = "유저"
        app_label = "user"

 

외래키 (Foreign key)

장고의 외래키는 아래와 같이 1:N의 관계를 나타낼 수 있다.

아래의 모델은 질문과 답변의 구조임 해당 구조에서 질문은 하나이고 여러개의 답변을 가질 수 있다.

 

python manage.py migrate명령어로 DB를 생성했을때

 

answer 테이블에 아래 이미지와 같이 외래키가 생성되는걸 볼 수 있다.

외래키 이미지

아래에서 related_name은 나중에 View단에서 역참조를할때 자주 사용된다.

class Question(BaseModel):
    question_index = models.AutoField(primary_key=True, verbose_name="질문고유키")
    qt_content = models.TextField(verbose_name="질문 내용")

    class Meta:
        db_table = "questions"
        verbose_name = "질문"


class Answer(BaseModel):
    answer_index = models.AutoField(primary_key=True, verbose_name="답변고유키")
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name="question_for_answer")
    # selected = models.CharField(max_length=1, blank=True, null=True, verbose_name="답변선택")
    as_content = models.TextField(verbose_name="답변 내용")

    class Meta:
        db_table = "answers"
        verbose_name = "답변"

이 외에도 장고에서는 one to one , one to many 모델을 지원함

'아카이브' 카테고리의 다른 글

Django - 실습편 JWT (4)  (0) 2021.06.08
Django - 실습편 view (3)  (0) 2021.06.08
Django - 실습편 기본세팅 (1)  (0) 2021.06.08
ruby on rails - 실습 세팅편(1)  (0) 2021.06.03
마이크로서비스 아키텍처 - 개념정리 (3)  (0) 2021.05.29