backend django tutorial #3 모델만들기

eunji hwang·2020년 4월 7일
1

BACKEND-PYTHON-DJANGO

목록 보기
8/28
post-custom-banner

지금까지의 과정 정리

  • 가상환경생성
    conda create -n <가상환경이름> python=3.8

  • 가상환경 활성화
    conda activate <가상환경이름>

  • 프로젝트 폴더로 이동 & 장고 설치
    cd ..<프로젝트경로>
    pip install django

  • 프로젝트 디렉토리에 장고 프로젝트 설치
    django-admin startproject <프로젝트명> : 프로젝트명/프로젝트명 으로 구조 생성
    django-admin startproject <프로젝트명> . : 현재폴더에/프로젝트명 으로 구조 생성

  • settings.py

    • INSTALLED_APPS : 기본 앱 중에 사용 안할것 주석처리
    • MIDDLEWEAR : 안쓸것 주석처리
    • DB 설정
    • 시크릿키 빼두기 (루트/config/my_settings.py 안에 SECRET_KEY 변수에 담아관리)

앱만들기

python manage.py startapp <앱이름>

뷰작성

앱이름/views.py 작성하기
뷰가 불필요하면 작성하지 않아도 된다.

클래스

아래 예제코드는 회원가입 관련 views.py

from django.views import View # 뷰 작성을 위한 클래스 임포트
from django.http import HttpResponse, JsonResponse # http관련 모듈 임포트

form .models import User

def 유효성검사할함수(): # 회원가입시 진행할 유효성 검사 함수를 작성
    return bool
    
class SignUpView(View) :# 뷰 클래스를 상속받아 사용
    # 회원가입 인풋 유효성검사
    VALIDATION_RULES = {
        "email" : {
            "validatior": 유효성검사할함수,
            "message": "invalid email" # false일때 전달메세지
         }, ...
     }
     
     def post(self,req): # post요청일때 할것 
         # req.body에 담긴것을 json으로 변환하여 data 변수에 담는다
         data = json.loads(req.body)
         
        try :
            # 각 필드에 대한 값이 맞는지 확인한다
            for field in data :
                rule = VALIDATION_RULES[field]
                if rule['validator'](data[filed):
                    return JsonResponse({'error':rule['message']}, status=400)
            if len(data['password']) < 6 : # 비밀번호가 6보다 짧을때 
                return JsonResponse({"message":"비밀번호짧"},status=400)
            
            # 유효성검사 문제 없을경우 데이터 베이스에 저장
            User(
                email = data['email']
                password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
            ).save()
                    
        expect ValidationError : 
            return HttpResponse(status=400)
            
        expect KeyError : 
            return HttpResponse(status=400)
    

urls.py 작성

앱의 urls.py와 프로젝트의 urls.py 2개 파일을 수정해야 한다.

1) 앱 urls.py

# urls.py에서 항상 불러오는 모듈
from django.urls  import path 
# 해당앱에서 내가 만든 views를 불러들인다
from .views       import SignUpView , SignInView , KakaoSignInView , AddressView 

# urlpatterns 리스트
urlpatterns = [
    # path('경로', 뷰클래스.as_view()),
    path('/signup', SignUpView.as_view()),
    path('/signin', SignInView.as_view()),
    # url 파라미터 접근
    path('/address/<int:address_id>' , AddressView.as_view()),
]

2) 루트 urls.py

# path와 include를 임포트한다
from django.urls import path, include

# 루트경로일때 사용할 홈뷰를 가져온다.
from .views import HomeView

urlpatterns = [
    path('products', include('products.urls')), # product 앱의 urls 연결
    path('', HomeView.as_view()), # 루트 접근시 get으로 날리는 것
    path('order', include('order.urls')), # order 앱의 urls 연결
    path('account', include('account.urls')) # account 앱의 urls 연결
]

migrate

python manage.py migrate 로 초기 마이그레이트 > db 적용

모델만들기

  • 앱/models.py 작성
    • 해당앱에서 사용하는 데이터베이스를 만든다.
from django.db import models

class User(models.Model): # 모델 모듈의 Model클래스를 상속받는다
    email      = models.EmailField(max_length=200, unique=True, verbose_name='email', null=True)
    password   = models.CharField(max_length=200, null=True)
    first_name = models.CharField(max_length=45, null=True)
    last_name  = models.CharField(max_length=45, null=True)
    create_at  = models.DateTimeField(auto_now_add=True, null=True)
    update_at  = models.DateTimeField(auto_now=True, null=True)
    is_delete  = models.BooleanField(default=False)
    address    = models.ManyToManyField('Address', through='User_address')

class User_address(models.Model): # FK의 경우 참고
    address = models.ForeignKey('Address', on_delete=models.CASCADE, null=True)
    user    = models.ForeignKey('User', on_delete=models.CASCADE, null=True)

    class Meta:
        db_table = 'user_addresses'

    class Meta: 
        db_table = 'users' # 테이블 이름 지정

field 메서드

  • EmailField()
  • CharField()
  • DateTimeField()
  • BooleanField()
  • ManyToManyField()
  • ForeignKey()
  • DecimalField()
  • TextField()
  • IntegerField()

field 인자

  • max_length = int
  • null = bool
  • unique = bool
  • verbose_name ='str'
  • auto_now_add = bool
  • auto_now = bool
  • through ='str'
  • on_delete = models.CASCADE
  • on_delete = models.SET_NULL
  • max_digits = int
  • decimal_places = int
  • default

Meta

class Meta:
    db_table ='테이블이름'

모델 활성화

models.py 파일을 수정하면 모델활성화를 해준다. migrations, migrate는 내가 짠 코드와 DB를 서로 공유? 같게 만들어주는 기능~

settings.py 수정

  • INSTALLED_APPS 목록에 위에서 생성한 앱 or 앱설정을 추가한다.
INSTALLED_APPS = [
	'django.~~.~~,
	<앱이름>, # 앱이름만 넣어 추가해도 되고
        <앱이름>.apps.<Appname>Config # polls.apps.PollsConfig
    ]

앱 추가

<앱이름>,

앱 설정 추가

<앱이름>.apps.<Appname>Config

  • 예> polls.apps.PollsConfig

makemigrations

python manage.py makemigrations polls

polls 앱 마이그레이션 하기, 마이그레이션을 실행시키면 내가 모델을 변경(새로만들기, 수정, 지우기 등)시킨 사실과 변경사항들이 migration으로 저장하고싶다고 django에게 알린다. 위 명령어를 사용할 때마다
<앱이름>/migrations/<코드>_initial.py 파일이 생성된다.

  • Question 모델 생성
  • Choise 모델 생성

python manage.py sqlmigrate polls 0001
python manage.py sqlmigrate <앱이름> <마이그레이션코드숫자4자리>
마이그레이션 코드와 위 명령어로 어떤 변경사항이 있었는지 알수 있다.

마이그레이트 & 마이그레이션 ?

  1. (models.py 에서) 모델을 변경합니다.
  2. python manage.py makemigrations을 통해 이 변경사항에 대한 마이그레이션을 만드세요.
  3. python manage.py migrate 명령을 통해 변경사항을 데이터베이스에 적용하세요.

python manage.py shell

인터프리터 데이터베이스 가지고 놀아보자.

.save()

save()명령어로 db에 데이터를 저장한다.

profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!
post-custom-banner

0개의 댓글