본문 바로가기

내일 배움 캠프/TIL

TIL) 4주차 3일 - 장고 실무 기초

 

오늘은 장고 실무 기초 강의와

 

팀원들과 코딩 테스트 문제 하나를 풀었다.

 

강의에서는 ORM과 QuerySet이 설명이 적어서

 

따로 찾아보며 완벽하게 익혔다! 

 


01. Django ORM / QuerySet 

1) Django ORM 이란?

  • 데이터베이스를 하나의 '객체(object)'로 보고, SQL 쿼리문 없이 데이터베이스의 데이터들을 다룰
    수 있게 하는것

 

2) 쿼리셋(QuerySet) 이란? 

  • 전달받은 모델의 객체 목록을 말한다. 예를들어, person.objects의 의미는 objects라는 객체가 person이라는 데이터베이스를 쿼리셋 형태로 만들겠다는 의미이다. 쿼리셋은 '객체' 이지만 일반적인 객체에서 사용하는 속성(객체.변수 / 객체.함수()와 같은 속성)들을 사용할 수 없다. 쿼리셋은 데이터베이스의 여러 레코드(row)를 나타낸다.

02. QuerySet Method

1) Method 사용법

  • [클래스명].objects.메소드()

 

2) Method 종류

  • .all()
  • .filter()
  • .get()
  • .values()
  • .exclude()
  • .first()
  • .last()
  • .count() 

 

3) 이번에 사용한 Method

  • .filter()
    • 특정 조건에 맞는 Row만 조회하고 싶을 때 사용. QuerySet 타입으로 반환
exist_user = UserModel.objects.filter(username=username)
  • .get()
    • 하나의 Row만 조회한다. .get()은 QuerySet 타입이 아닌 객체 타입으로 반환하기 때문에 뒤에 다른 메소드를 추가 할 수 없다.
    • 값이 없을 때는 DoesNotExist 에러를 발생시킨다.

    • 값이 한 개가 아닐 경우에는 MultipleObjectsReturned 에러를 발생시킨다.

 


03. GET / POST / 주요 기능

GETPOST는 인터넷으로 통신하는 방법이다.

 

좀더 자세하게 알아보면,

 

1) GET 요청

  • 값을 읽어 올 때 사용

 

2) POST 요청

  • 값을 주거나 수정, 삭제를 요청 할 때 사용

 

3) 사용 예시

  • request.method == 'GET' or request.method == 'POST' : GET 또는 POST 용청이 들어 올 경우 라는 뜻
  • request.POST.get('username', None) : post로 가져온 데이터 중에 username이라는 이름의 데이터를 가져오고
    만약 username이 없다면 None(빈칸)으로 처리하겠다 라는 뜻
  • render(request, 'user/signup.html') : user 폴더의 signup html을 화면에 보여주겠다 라는 뜻
  • .save() : 저장 기능
  • html에서의 <form 태그> : 화면에 있는 데이터를 서버로 전송할 때 사용
  • {% csrf_token %} : 장고에서 데이터를 post 방식으로 보낼 때 보안을 지켜주는 기능

 


04. {% ... %}

{% ... %}이란?

  • 템플릿 문법으로써 중복해서 html을 계속 작성하지 않아도 되도록 도와주고 html 파일에 파이썬의 
    기능들을 추가해 줄 수 있도록 도와주는 기능

 


 

05. 팀원들과 알고리즘 풀이

https://school.programmers.co.kr/learn/courses/30/lessons/120842 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

'2차원으로 만들기' 라는 문제인데 처음에 접근한 방법은 다음과 같다.

def solution(n_list, n):
    n_ = []
    list_n = []
    a = 0
    num = 0

    while (a < len(n_list)//n):
        for i in range(1, len(n_list)//(len(n_list)//n)+1):
            n_.append(n_list[num])
            num += 1
        a += 1
        list_n.append(n_)
        
    return list_n

리스트 n_n의 수만큼 기존의 리스트를 묶으려고  for i in range(1, len(n_list)//(len(n_list)//n)+1) 문을 사용 하였고,

리스트 n_n_list[index]를 추가하는 식으로 할려 했으나 원하는 것처럼 안나왔다..

같은 팀원분에게 힌드를 얻어서 list_n.append(n_) 다음줄에 n_ = [] 을 넣음으로써 해결을 했다! 이러한 이유는 while문을 반복할때 기존의 리스트 n_의 값은 기존의 값에서 계속 추가가 되기때문에 이런 문제가 생긴것이다. 따라서 n_ = [] 을 넣으면 기존의 값이 빈값으로 초기화 되고 뒤에 값들이 들어가서 원하는 값이 나온다. 최종 코드는 다음과 같다.

def solution(n_list, n):
    n_ = []
    list_n = []
    a = 0
    num = 0

    while (a < len(n_list)//n):
        for i in range(1, len(n_list)//(len(n_list)//n)+1):
            n_.append(n_list[num])
            num += 1
        a += 1
        list_n.append(n_)
        n_ = []
    return list_n

 

다음은 다른 팀원분들의 다양한 방법이다

# 1
def solution(num_list, n):
    answer = []
    small_list = []
    for num in num_list:
        small_list.append(num)
        if len(small_list) >= n :
            answer.append(small_list)
            small_list = []
    return answer
    
 
# 2
import numpy as np

def solution(num_list, n):
    return np.reshape(num_list, (int(len(num_list)/n),n)).tolist()

 

 


 

'내일 배움 캠프 > TIL' 카테고리의 다른 글

TIL) 5주차 1일  (0) 2023.04.11
TIL) 4주차 4일 - 장고 실무 기초  (0) 2023.04.07
TIL) 4주차 2일 - 장고 실무 기초  (0) 2023.04.05
TIL) 4주차 1일 - 장고 실무 기초  (0) 2023.04.03
TIL) 3주차 4일  (0) 2023.04.01