Skip to content

Latest commit

 

History

History
643 lines (483 loc) · 18.5 KB

File metadata and controls

643 lines (483 loc) · 18.5 KB

2022-08-25 / DB 8일차 실습

1. db/models.py 파일에 아래의 모델 3개 Director Genre Movie 를 작성하세요.

기본 코드

class Director(models.Model):
    name = models.TextField()
    debut = models.DateTimeField()
    country = models.TextField()

class Genre(models.Model):
    title = models.TextField()

class Movie(models.Model):
    director = models.ForeignKey(Director,on_delete=models.CASCADE)
    genre = models.ForeignKey(Genre,on_delete=models.CASCADE)
    title = models.TextField()
    opening_date = models.DateField()
    running_time = models.IntegerField()
    screening = models.BooleanField()

2. 모델을 마이그레이트(migrate) 하세요.

# 가상환경 실행 확인 후 아래 명령어를 터미널에 입력합니다.
python manage.py makemigrations

python manage.py migrate

3. 아래 코드를 실행해서 데이터를 추가하세요.

directors = [
    ("봉준호","1993-01-01","KOR"),
    ("김한민","1999-01-01","KOR"),
    ("최동훈","2004-01-01","KOR"),
    ("이정재","2022-01-01","KOR"),
    ("이경규","1992-01-01","KOR"),
    ("한재림","2005-01-01","KOR"),
    ("Joseph Kosinski","1999-01-01","KOR"),
    ("김철수","2022-01-01","KOR"),
]

for director in directors:
    name_ = director[0]
    debut_ = director[1]
    country_ = director[2]
    Director.objects.create(name=name_, debut=debut_, country=country_)

genres = ["액션","드라마","사극","범죄","스릴러","SF","무협","첩보","재난"]

for title_ in genres:
    genre = Genre()
    genre.title = title_
    genre.save()

4. Queryset 메소드 get 을 활용해서 Director 테이블에서 name 이 봉준호인 데이터를 아래와 같이 출력하는 코드를 작성하세요.

출력 예시

id : 1
name : 봉준호
debut : 1993-01-01 00:00:00
country : KOR

코드 작성

bong = Director.objects.get(id=1)
print(f'id : {bong.id}\nname : {bong.name}\ndebut : {bong.debut}\ncountry : {bong.country}')

5. Queryset 메소드 get 을 활용해서 Genre 테이블에서 title 이 드라마인 데이터를 아래와 같이 출력하는 코드를 작성하세요.

출력 예시

id : 2
title : 드라마

코드 작성

drama = Genre.objects.get(title="드라마")
print(f'id : {drama.id}\ntitle : {drama.title}')

6. 위 문제에서 찾은 directorgenre 와 아래 힌트 코드를 활용해서 Movie 테이블에 아래 데이터를 추가하는 코드를 작성하세요.

director genre title opening_data running_time screening
봉준호 드라마 기생충 2019-05-30 132 False

힌트 코드

director_ = Director.objects.get(name='봉준호')
genre_ = Genre.objects.get(title='드라마')

movie = Movie()

# 나머지 코드를 완성시켜주세요.
# ...
# ...

movie.save()

코드 작성

# class Movie(models.Model):
#    director = models.ForeignKey(Director,on_delete=models.CASCADE)
#    genre = models.ForeignKey(Genre,on_delete=models.CASCADE)
#    title = models.TextField()
#    opening_date = models.DateField()
#    running_time = models.IntegerField()
#    screening = models.BooleanField()

# 시작
movie = Movie()

# 객체로 저장된 director_, genre_ 다루기
director_ = Director.objects.get(name='봉준호')
movie.director = director_
genre_ = Genre.objects.get(title='드라마')
movie.genre = genre_

# 나머지 title, opening_date, running_time, screening 는 값으로 다루기
movie.title = "기생충"
movie.opening_date = "2019-05-30"
movie.running_time = 132
movie.screening = False

# DB에 반영
movie.save()

-------- 테스트용 코드 --------

movie = Movie()
director_ = Director.objects.get(name='봉준호')
movie.director = director_
genre_ = Genre.objects.get(title='드라마')
movie.genre = genre_
movie.title = "기생충"
movie.opening_date = "2019-05-30"
movie.running_time = 132
movie.screening = False
movie.save()

7. Movie 테이블에 아래 데이터를 추가하는 코드를 작성하세요.

director genre title opening_date running_time screening
봉준호 드라마 괴물 2006-07-27 119 False
봉준호 SF 설국열차 2013-10-30 125 False
김한민 사극 한산 2022-07-27 129 True
최동훈 SF 외계+인 2022-07-20 142 False
이정재 첩보 헌트 2022-08-10 125 True
이경규 액션 복수혈전 1992-10-10 88 False
한재림 재난 비상선언 2022-08-03 140 True
Joseph Kosinski 액션 탑건 : 매버릭 2022-06-22 130 True
movies = [
    ("봉준호", "드라마", "괴물", "2006-07-27", 119, False),
    ("봉준호", "SF", "설국열차", "2013-10-30", 125, False),
    ("김한민", "사극", "한산", "2022-07-27", 129, True),
    ("최동훈", "SF", "외계+인", "2022-07-20", 142, False),
    ("이정재", "첩보", "헌트", "2022-08-10", 125, True),
    ("이경규", "액션", "복수혈전", "1992-10-10", 88, False),
    ("한재림", "재난", "비상선언", "2022-08-03", 140, True),
    ("Joseph Kosinski", "액션", "탑건 : 매버릭", "2022-06-22", 130, True),
]

코드 작성

movies = [
    ("봉준호", "드라마", "괴물", "2006-07-27", 119, False),
    ("봉준호", "SF", "설국열차", "2013-10-30", 125, False),
    ("김한민", "사극", "한산", "2022-07-27", 129, True),
    ("최동훈", "SF", "외계+인", "2022-07-20", 142, False),
    ("이정재", "첩보", "헌트", "2022-08-10", 125, True),
    ("이경규", "액션", "복수혈전", "1992-10-10", 88, False),
    ("한재림", "재난", "비상선언", "2022-08-03", 140, True),
    ("Joseph Kosinski", "액션", "탑건 : 매버릭", "2022-06-22", 130, True),
]

for i in movies:
    movie = Movie()
    dir_ = Director.objects.get(name=i[0])
    gen_ = Genre.objects.get(title=i[1])
    tit_ = i[2]
    ope_ = i[3]
    run_ = i[4]
    scr_ = i[5]
    
    movie.director = dir_
    movie.genre = gen_
    movie.title = tit_
    movie.opening_date = ope_
    movie.running_time = run_
    movie.screening = scr_
    
    movie.save()
    

8. Movie 테이블의 모든 데이터를 출력하는 코드를 작성하세요.

예시 출력

Director object (1) Genre object (2) 기생충 2019-05-30 132 False
Director object (1) Genre object (2) 괴물 2006-07-27 119 False
Director object (1) Genre object (6) 설국열차 2013-10-30 125 False
Director object (2) Genre object (3) 한산 2022-07-27 129 True
Director object (3) Genre object (6) 외계+인 2022-07-20 142 False
Director object (4) Genre object (8) 헌트 2022-08-10 125 True
Director object (5) Genre object (1) 복수혈전 1992-10-10 88 False
Director object (6) Genre object (9) 비상선언 2022-08-03 140 True
Director object (7) Genre object (1) 탑건 : 매버릭 2022-06-22 130 True

코드 작성

see_all = Movie.objects.all()

for i in see_all:
    dir_obj = Director.objects.get(id=i.director_id)
    gen_obj = Genre.objects.get(id=i.genre_id)
    print(dir_obj, gen_obj, i.title, i.opening_date, i.running_time, i.screening)

-------- 다른 코드 --------

for i in Movie.objects.all():
    print(i.director, i.genre, i.title, i.opening_date, i.running_time, i.screening)

9. 위 문제에서 조회한 Director object (n) 를 활용해서 각 영화의 감독 name 을 조회해서 대신 출력하는 코드를 작성하세요.

힌트 : 각각의 Director object (n)는 Director 모델의 인스턴스입니다.

예시 출력

봉준호 Genre object (2) 기생충 2019-05-30 132 False
봉준호 Genre object (2) 괴물 2006-07-27 119 False
봉준호 Genre object (6) 설국열차 2013-10-30 125 False
김한민 Genre object (3) 한산 2022-07-27 129 True
최동훈 Genre object (6) 외계+인 2022-07-20 142 False
이정재 Genre object (8) 헌트 2022-08-10 125 True
이경규 Genre object (1) 복수혈전 1992-10-10 88 False
한재림 Genre object (9) 비상선언 2022-08-03 140 True
Joseph Kosinski Genre object (1) 탑건 : 매버릭 2022-06-22 130 True

코드 작성

see_name_all = Movie.objects.all()

for i in see_name_all:
    dir_obj = Director.objects.get(id=i.director_id)
    gen_obj = Genre.objects.get(id=i.genre_id)
    print(dir_obj.name, gen_obj, i.title, i.opening_date, i.running_time, i.screening)
    
-------- 다른 코드 --------

for i in Movie.objects.all():
    print(i.director.name, i.genre, i.title, i.opening_date, i.running_time, i.screening)

10. 위 문제에서 조회한 Genre object (n) 를 활용해서 각 영화의 장르 title 을 조회해서 대신 출력하는 코드를 작성하세요.

힌트 : 각각의 Genre object (n)는 Genre 모델의 인스턴스입니다.

예시 출력

봉준호 드라마 기생충 2019-05-30 132 False
봉준호 드라마 괴물 2006-07-27 119 False
봉준호 SF 설국열차 2013-10-30 125 False
김한민 사극 한산 2022-07-27 129 True
최동훈 SF 외계+인 2022-07-20 142 False
이정재 첩보 헌트 2022-08-10 125 True
이경규 액션 복수혈전 1992-10-10 88 False
한재림 재난 비상선언 2022-08-03 140 True
Joseph Kosinski 액션 탑건 : 매버릭 2022-06-22 130 True

코드 작성

see_all = Movie.objects.all()

for i in see_all:
    dir_obj = Director.objects.get(id=i.director_id)
    gen_obj = Genre.objects.get(id=i.genre_id)
    print(dir_obj.name, gen_obj.title, i.title, i.opening_date, i.running_time, i.screening)
    
-------- 다른 코드 --------

for i in Movie.objects.all():
    print(i.director.name, i.genre.title, i.title, i.opening_date, i.running_time, i.screening)

11. 영화 데이터들을 최신 개봉한 영화순으로 조회해서 출력하는 코드를 작성하세요.

예시 출력

이정재 첩보 헌트 2022-08-10 125 True
한재림 재난 비상선언 2022-08-03 140 True
김한민 사극 한산 2022-07-27 129 True
최동훈 SF 외계+인 2022-07-20 142 False
Joseph Kosinski 액션 탑건 : 매버릭 2022-06-22 130 True
봉준호 드라마 기생충 2019-05-30 132 False
봉준호 SF 설국열차 2013-10-30 125 False
봉준호 드라마 괴물 2006-07-27 119 False
이경규 액션 복수혈전 1992-10-10 88 False

코드 작성

see_all = Movie.objects.order_by('-opening_date')

for i in see_all:
    dir_obj = Director.objects.get(id=i.director_id)
    gen_obj = Genre.objects.get(id=i.genre_id)
    print(dir_obj.name, gen_obj.title, i.title, i.opening_date, i.running_time, i.screening)
    
-------- 다른 코드 --------
    
for i in Movie.objects.order_by('-opening_date'):
    print(i.director.name, i.genre.title, i.title, i.opening_date, i.running_time, i.screening)

12. 영화 데이터 중 가장 먼저 개봉한 영화를 조회해서 출력하는 코드를 작성하세요.

예시 출력

이경규 액션 복수혈전 1992-10-10 88 False

코드 작성

date_order = Movie.objects.order_by('opening_date')

for i in date_order:
    dir_obj = Director.objects.get(id=i.director_id)
    gen_obj = Genre.objects.get(id=i.genre_id)
    print(dir_obj.name, gen_obj.title, i.title, i.opening_date, i.running_time, i.screening)
    break
    
-------- 다른 코드 --------

first_ = Movie.objects.order_by('opening_date')[0]
print(first_.director.name, first_.genre.title, first_.title, first_.opening_date, first_.running_time, first_.screening)

13. 영화 데이터 중 현재 상영 중인 영화들을 개봉일 순으로 조회해서 출력하는 코드를 작성하세요.

상영 중 screening = True

예시 출력

Joseph Kosinski 액션 탑건 : 매버릭 2022-06-22 130 True
김한민 사극 한산 2022-07-27 129 True
한재림 재난 비상선언 2022-08-03 140 True
이정재 첩보 헌트 2022-08-10 125 True

코드 작성

scr_on = Movie.objects.filter(screening=True).order_by('opening_date')

for i in scr_on:
    dir_obj = Director.objects.get(id=i.director_id)
    gen_obj = Genre.objects.get(id=i.genre_id)
    print(dir_obj.name, gen_obj.title, i.title, i.opening_date, i.running_time, i.screening)

-------- 다른 코드 --------

scr_on = Movie.objects.filter(screening=True).order_by('opening_date')
for i in scr_on:
    print(i.director.name, i.genre.title, i.title, i.opening_date, i.running_time, i.screening)

14. 영화 감독이 봉준호 인 영화들을 개봉일 순으로 조회해서 출력하는 코드를 작성하세요.

힌트 : name이 봉준호인 Director의 인스턴스가 필요합니다.

예시 출력

봉준호 드라마 괴물 2006-07-27 119 False
봉준호 SF 설국열차 2013-10-30 125 False
봉준호 드라마 기생충 2019-05-30 132 False

코드 작성

bongs = Movie.objects.filter(director_id=1).order_by('opening_date')

for i in bongs:
    dir_obj = Director.objects.get(id=i.director_id)
    gen_obj = Genre.objects.get(id=i.genre_id)
    print(dir_obj.name, gen_obj.title, i.title, i.opening_date, i.running_time, i.screening)
    
-------- 다른 코드 --------

bongs = Director.objects.get(name='봉준호')
bongss = Movie.objects.filter(director=bongs).order_by('opening_date')

for i in bongss:
    print(i.director.name, i.genre.title, i.title, i.opening_date, i.running_time, i.screening)

15. 봉준호 감독 영화 중 두 번째로 개봉한 영화를 조회해서 출력하는 코드를 작성하세요.

예시 출력

봉준호 SF 설국열차 2013-10-30 125 False

코드 작성

bongs = Director.objects.get(name='봉준호')
bongss = Movie.objects.filter(director=bongs).order_by('opening_date')[1]

print(bongss.director.name, bongss.genre.title, bongss.title, bongss.opening_date, bongss.running_time, bongss.screening)

16. 영화의 상영 시간 running_time 이 119 보다 큰 영화들을 상영 시간순으로 조회해서 출력하는 코드를 작성하세요.

예시 출력

봉준호 SF 설국열차 2013-10-30 125 False
이정재 첩보 헌트 2022-08-10 125 True
김한민 사극 한산 2022-07-27 129 True
Joseph Kosinski 액션 탑건 : 매버릭 2022-06-22 130 True
봉준호 드라마 기생충 2019-05-30 132 False
한재림 재난 비상선언 2022-08-03 140 True
최동훈 SF 외계+인 2022-07-20 142 False

코드 작성

run_gt_119 = Movie.objects.filter(running_time__gt=119).order_by('running_time')

for i in run_gt_119:
    dir_obj = Director.objects.get(id=i.director_id)
    gen_obj = Genre.objects.get(id=i.genre_id)
    print(dir_obj.name, gen_obj.title, i.title, i.opening_date, i.running_time, i.screening)
    
-------- 다른 코드 --------

run_gt_119 = Movie.objects.filter(running_time__gt=119).order_by('running_time')

for i in run_gt_119:
    print(i.director.name, i.genre.title, i.title, i.opening_date, i.running_time, i.screening)

17. 영화의 상영 시간 running_time 이 119 이상인 영화들을 상영 시간순으로 조회해서 출력하는 코드를 작성하세요.

예시 출력

봉준호 드라마 괴물 2006-07-27 119 False
봉준호 SF 설국열차 2013-10-30 125 False
이정재 첩보 헌트 2022-08-10 125 True
김한민 사극 한산 2022-07-27 129 True
Joseph Kosinski 액션 탑건 : 매버릭 2022-06-22 130 True
봉준호 드라마 기생충 2019-05-30 132 False
한재림 재난 비상선언 2022-08-03 140 True
최동훈 SF 외계+인 2022-07-20 142 False

코드 작성

run_gte_119 = Movie.objects.filter(running_time__gte=119).order_by('running_time')

for i in run_gte_119:
    dir_obj = Director.objects.get(id=i.director_id)
    gen_obj = Genre.objects.get(id=i.genre_id)
    print(dir_obj.name, gen_obj.title, i.title, i.opening_date, i.running_time, i.screening)
    
-------- 다른 코드 --------

run_gte_119 = Movie.objects.filter(running_time__gte=119).order_by('running_time')

for i in run_gte_119:
    print(i.director.name, i.genre.title, i.title, i.opening_date, i.running_time, i.screening)

18. 2022-01-01 이후로 개봉한 영화를 개봉일 순으로 조회해서 출력하는 코드를 작성하세요.

예시 출력

Joseph Kosinski 액션 탑건 : 매버릭 2022-06-22 130 True
최동훈 SF 외계+인 2022-07-20 142 False
김한민 사극 한산 2022-07-27 129 True
한재림 재난 비상선언 2022-08-03 140 True
이정재 첩보 헌트 2022-08-10 125 True

코드 작성

open_gt = Movie.objects.filter(opening_date__gt='2022-01-01').order_by('opening_date')

for i in open_gt:
    dir_obj = Director.objects.get(id=i.director_id)
    gen_obj = Genre.objects.get(id=i.genre_id)
    print(dir_obj.name, gen_obj.title, i.title, i.opening_date, i.running_time, i.screening)
    
-------- 다른 코드 --------

open_gt = Movie.objects.filter(opening_date__gt='2022-01-01').order_by('opening_date')

for i in open_gt:
    print(i.director.name, i.genre.title, i.title, i.opening_date, i.running_time, i.screening)

19. 봉준호 감독 영화 중 장르가 드라마인 영화들을 개봉일 순으로 조회해서 출력하는 코드를 작성하세요.

힌트 :Movie.objects.filter(조건1, 조건2,...) 이 코드는 WHERE 조건1 AND 조건2 와 동일합니다.

예시 출력

봉준호 드라마 괴물 2006-07-27 119 False
봉준호 드라마 기생충 2019-05-30 132 False

코드 작성

bongs = Director.objects.get(name='봉준호')
dramas = Genre.objects.get(title='드라마')

ordered = Movie.objects.filter(director=bongs, genre=dramas).order_by('opening_date')

for i in ordered:
    print(i.director.name, i.genre.title, i.title, i.opening_date, i.running_time, i.screening)

20. 봉준호 감독의 영화가 아닌 영화들을 개봉일 순으로 조회해서 출력하는 코드를 작성하세요.

힌트 : filter 와 반대되는 메소드로 exclude 가 있습니다.

참고 사이트

[Django] QuerySet 메소드 정리 (2) - CRUD

예시 출력

이경규 액션 복수혈전 1992-10-10 88 False
Joseph Kosinski 액션 탑건 : 매버릭 2022-06-22 130 True
최동훈 SF 외계+인 2022-07-20 142 False
김한민 사극 한산 2022-07-27 129 True
한재림 재난 비상선언 2022-08-03 140 True
이정재 첩보 헌트 2022-08-10 125 True

코드 작성

bongs = Director.objects.get(name='봉준호')
not_bongs = Movie.objects.exclude(director=bongs).order_by('opening_date')

for i in not_bongs:
    print(i.director.name, i.genre.title, i.title, i.opening_date, i.running_time, i.screening)