Miner

DAY 11 본문

데브코스

DAY 11

MineTime76 2023. 10. 30. 22:41

* 파이썬 장고 프레임워크를 사용해서 API 서버 만들기(1)

 

https://challengvirus.tistory.com/entry/%EC%9E%A5%EA%B3%A0-Instagram-clone-1-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EC%A4%80%EB%B9%84%ED%95%98%EA%B8%B0

 

장고 Instagram clone #1 가상환경 준비하기

https://www.youtube.com/watch?v=M8UPyeF5DfM&t=6887s 를 참고 해서 만들어 봤습니다. 1. 파이썬 가상환경 사용 1. C드라이브에 venvs 폴더 만들기 mkdir venvs 2. venvs 폴더 안에 가서 가상환경 만들기 C:venvs > python -m v

challengvirus.tistory.com

 

https://challengvirus.tistory.com/entry/%EC%9E%A5%EA%B3%A0-Instagram-clone-2-%EC%95%B1-%EC%83%9D%EC%84%B1-%EA%B0%84%EB%8B%A8%ED%95%9C-%EA%B2%B0%EA%B3%BC%EB%9D%84%EC%9A%B0%EA%B8%B0

 

장고 Instagram clone #3 앱 생성, 간단한 결과띄우기

1. 프로젝트 단독으로는 아무런 일도 할 수 없다. 좁게 말해 기능을 담당하는 APP(앱) 생성 (instagram) C:\projects\instagram> django-admin startapp instagram 2. 간단한 문자열을 출력하기 urls.py from django.contrib impo

challengvirus.tistory.com

 

1. 장고 화면에 HelloWorld 띄우기

** HttpResponse 메소드 활용

 

Urls.py

polls.urls.py

polls.views.py

2. Model

모델 생성 - 모델을 테이블에 써 주기 위한 마이그레이션 - 모델에 맞는 테이블을 만든다

settings.py 에 등록

python manage.py sqlmigrate poll 0001 : 쿼리문 조회

 

* ID 칼럼은 자동 생성

python manage.py migrate

 

3. 장고의 다양한 모델 필드 활용하기

https://docs.djangoproject.com/en/4.2/ref/models/fields/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

* 자주 쓰이는 필드

  • BooleanField
  • CharField
  • DateField

** sqlite3 db.sqlite3 코드가 작동이 안됨

 

DB Browser for SQLite 사용

(마이그레이션 롤백) 0002를 생성했다가 다시 0001 상태로 돌아가고 싶을 때

4. Django Admin 

CRUD - Create(생성), Read(읽기), Update(갱신), Delete(삭제)

 

1. 슈퍼유저 만들기 / 

python manage.py createsuperuser

 

슈퍼유저 로그인으로 진입한 후, admin2 라는 사용자를 만들고

하게 되면 admin2에게도 슈퍼유저 권한을 부여할 수 있다

 

5. 모델 등록하기

- admin.py

※ 이때 과거에 롤백으로 모델을 마이그레이션 했던 것 때문에 Question Url 이 작동이 안됬음

 

- admin 페이지를 통해서 테이블에 인스턴스 추가

- models.py 에

- 새로운 데이터 필드를 활용

- makemigrations, migrate 를 진행 

...??

6. Django Shell 사용하기

python manage.py shell
from poll.models import *

Question.objects.all()
Choice.objects.all()

choice = Choice.objects.all()[0]
choice.id

choice.choice_text

# question 에서 choice 로 접근하려면, set 을 사용해야 한다 / 1-N 관계이기 때문에
question.choice_set.all()

 

** 실습

7. 현재 시간 구하기

from django.utils import timezone
timezone.now()

8. shell 에서 레코드 생성하기

q2 = Question.objects.all()[0]
q2.Question_text
>>> "휴가를 어디서 보내고 싶으세요"

q2 = Question.objects.first()
q2 = Question.objects.last()
q2.Question_text
>>> "휴가를 어디서 보내고 싶으세요"

자동으로 현재시간이 add 된다

# choice 만드는 2가지 방법

from django.utils import timezone
from poll.models import *

q3 = Question(question_text = "abc")
q3.save()

>>> q3.choice_set.create(choice_text="a")

>>> new_choice = Choice(choice_text="c", question=q3)
>>> new_choice.save()

9. shell 에서 모델 활용하기

* 수정

* 삭제

-> 잘 이해 안감. 다른 걸로 공부

#Choice 오브젝트 중 가장 마지막으로 만들어진 것을 가져오기
>>> choice = Question.objects.last()

#해당 오브젝트에 연결된 Question을 통해서 choice set을 가져오기
>>> choice.queston.choice_set.all()

#해당 오브젝트를 삭제하기
>>> choice.delete()

10. 모델 필터링

>>> from polls.models import *

#get() 메서드를 사용하여 조건에 해당하는 오브젝트를 필터링하기
>>> Question.objects.get(id=1)
>>> q = Question.objects.get(question_text__startswith='휴가를')
>>> Question.objects.get(pub_date__year=2023) #get으로 여러가지 오브젝트를 가져오려고 한다면 에러발생
polls.models.Question.MultipleObjectsReturned: get() returned more than one Question

#filter() 메서드를 사용하여 조건에 해당하는 오브젝트를 필터링하기
>>> Question.objects.filter(pub_date__year=2023)
<QuerySet [<Question: 제목: 휴가를 어디서 보내고 싶으세요?, 날짜: 2023-02-05 18:52:59+00:00>, <Question: 제목: 가장 좋아하는 디저트는?, 날짜: 2023-02-05 18:53:27+00:00>, ...]>
>>> Question.objects.filter(pub_date__year=2023).count()

#쿼리셋의 SQL 쿼리 살펴보기
>>> Question.objects.filter(pub_date__year=2023).query
>>> print(Question.objects.filter(pub_date__year=2023).query)
SELECT "polls_question"."id", "polls_question"."question_text", "polls_question"."pub_date" FROM "polls_question" WHERE "polls_question"."pub_date" BETWEEN 2023-01-01 00:00:00 AND 2023-12-31 23:59:59.999999

>>> Question.objects.filter(question_text__startswith='휴가를').query
>>> print(Question.objects.filter(question_text__startswith='휴가를').query)
SELECT "polls_question"."id", "polls_question"."question_text", "polls_question"."pub_date" FROM "polls_question" WHERE "polls_question"."question_text" LIKE 휴가를% ESCAPE "\"
"
>>> q = Question.objects.get(pk=1)
>>> q.choice_set.all()
>>> print(q.choice_set.all().query)
SELECT "polls_choice"."id", "polls_choice"."question_id", "polls_choice"."choice_text", "polls_choice"."votes" FROM "polls_choice" WHERE "polls_choice"."question_id" = 1

11. 모델 필터링 2

q = Question.objects.filter(question_text__startswith="휴가를")

q = Question.objects.filter(pub_date__year=2023)

q = Question.objects.filter(question_text__contatins="휴가")

Choice.objects.filter(votes__gt=0)
# 0보다 크다
Choice.objects.filter(votes__gt=0).update(votes=0)
# 0으로 초기화

Qustion.objects.filter(question_text__regex=r"^휴가.*어디")
# 정규 표현식
Qustion.objects.filter(question_text__startswith="휴가").filter(question_text__contains="어디")

12. 모델 관계 기반 필터링

* models.py

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    
    def __str__(self):
        return f'제목: {self.question_text}, 날짜: {self.pub_date}'
        
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    def __str__(self):
        return f'[{self.question.question_text}] {self.choice_text}'

* Django Shell

>>> from polls.models import *

#Question의 question_text 필드 값이 '휴가'로 시작하는 모든 Choice 오브젝트를 필터링하기
>>> Choice.objects.filter(question__question_text__startswith='휴가')

#exclude() 메서드를 사용하여 question_text 필드 값이 '휴가'로 시작하는 모든 Choice 오브젝트를 제외하고 필터링하기
>>> Question.objects.exclude(question_text__startswith='휴가')

13. 모델 메소드

from django.utils import timezone
import datetime

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    
    def __str__(self):
        if self.was_published_recently():
            new_badge = 'NEW!!!'
        else:
            new_badge = ''
        return f'{new_badge} 제목: {self.question_text}, 날짜: {self.pub_date}'

 

'데브코스' 카테고리의 다른 글

DAY 13  (0) 2023.11.01
DAY 12  (1) 2023.10.31
DAY 09  (0) 2023.10.26
DAY 08  (0) 2023.10.25
DAY 07  (0) 2023.10.24