자격증 & 문제풀이/Django-Project

[Django] Django와 데이터 연동

YSY^ 2020. 7. 19. 23:32

이번 포스팅에서는 Django에 데이터를 연동시키는 작업을 할 것입니다.

한증막.GG에서 사용한 데이터는 Steam(게임유통사이트)에서 추출한 데이터입니다.(2018년 4월 기준)

아래 데이터를 받아서 진행해주시기 바랍니다.

steam_sample.csv
0.22MB

 

■ 보유한 데이터 설명

데이터 내역
데이터 info

  • pc_requirements_minumum과 pc_requirements_recommended에서 null값은 not_supported로 치환하였습니다.
  • steam_appid는 게임상세정보페이지에서 steam사이트를 클릭했을때 해당게임페이지로 바로가는데에 활용되는 데이터입니다.
  • released_date_1은 게임이 공게된 날짜이며 대부분은 Apr 20, 2020 이런형식으로 되어있습니다.
  • price1부터 price5까지는 게임유통사이트5개를 가정하여 임의로 유통사마다 가격을 넣은것입니다.(추후 실시간으로 가격이 연동되면 필요가 없어지는 데이터입니다.)
  • price는 10000원부터 100000만원 사이로 설정되어 있습니다.(100원단위 반올림되어있습니다.)
  • price에서 0이 삽입되어 있는데 이것은 해당 유통사이트에 해당게임이 없을 수 있는 것을 가정해 놓은것입니다.
  • 예를들어, A게임의 price1가 0이라면 price1을 가진 유통사이트에는 해당게임이 없다는 의미이며, 게임상세정보에서 나타나지 않으며, 최저가를 산정할때도 포함되지 않게 할 것입니다.

 

■ 보유한 게임데이터를 Django에 연동

Django terminal에서 jupyter notebook 을 입력해서 jupyter notebook로 들어가고 shell.ipynb를 만듭니다.

먼저 장고에서 jupyter notebook를 적용을 시키는 코드를 입력해야합니다.

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings'
os.environ['DJANGO_ALLOW_ASYNC_UNSAFE'] = 'true'

import django
django.setup()

 

다음으로 Game model을 import하고 데이터(steam_sample를 불러옵니다.) 그리고 csv.reader 형식으로 변형합니다.

import csv
from game.models import Game
hand = open('steam_sample.csv','rt',encoding='UTF8')

reader = csv.reader(hand)
print(reader)

 

이제 bulk_list라는 빈리스트를 만들고 데이터를 리스트에 넣습니다.

여기서 try, except 구문을 쓴 이유는 release_at데이터에서 간혹 '%b %d, %Y형식이 아니라, 'release soon', 'spring 2018' 같이 형식이 다른 데이터가 몇개 있기 때문에 이 데이터들을 걸러내기 위한 구문입니다.

또한 index가 1부터 시작하는 이유는 steam_sample데이터를 만들때 맨앞column에 unnamed라는 필요없는 데이터가 자동으로 삽입되었기 때문입니다. ㅠㅠ

bulk_list = []
import datetime
cnt = 0
for idx, row in enumerate(reader):
    if idx==0:
        continue
    try:
        bulk_list.append(Game(app_id = row[1],
                              title=row[2],
                              developer=row[3],
                              genre=row[4],
                              release_at = datetime.datetime.strptime(row[5], '%b %d, %Y'),
                              info=row[6],
                              pc_requirements_minimum = row[7],
                              pc_requirements_recommended = row[8],
                              steam = row[9],
                              origin = row[10],
                              uplay = row[11],
                              epic_games = row[12],
                              drmfree = row[13]
                             ))
    except Exception as e:
        print(e)
        cnt+=1
        continue

 

이제 다음과 같은 코드를 입력하여 Django에 데이터를 적용시킵니다.

Game.objects.bulk_create(bulk_list)

 

Sqlite에서 다음과 같이 데이터가 삽입된 것을 확인할 수 있습니다.

 

■ 장르데이터를 Django에 연동

게임등록을 할때 장르리스트를 가지고 온것을 기억하실겁니다. 데이터 연동할 때 장르까지 같이 연동해줍니다.

(장고 안에서 장르를 입력해주어도 괜찮으나, 장르 개수가 많아지는 경우를 가정하여 데이터를 연동시키겟습니다.)

방식은 게임데이터를 연동할때와 같습니다.

## 장르
import csv
from game.models import Genre_list

kk = ['Adventure', 'Casual', 'Indie', 'RPG', 'Early Access', 'Violent', 'Gore', 'Free to Play', 'Strategy', 'Simulation', 'Action', 'Sports', 'Massively Multiplayer', 'Racing', 'Sexual Content', 'Nudity']
genre_list = []
for i in kk:
    genre_list.append(Genre_list(genre_list = i))
    
Genre_list.objects.bulk_create(genre_list)

Sqlite에서 장르리스트를 확인할 수 있습니다.

 

이제 모든 데이터가 연동되었습니다. 다음포스팅에서는 게임세부정보를 만드는 작업을 하겠습니다.

728x90
반응형