django에서 mongoDB 사용하면서 배우기1

김범기·2024년 5월 31일

django

목록 보기
5/12

개요

react 계열과 javascript만 주구장창 만지다가 백엔드로 django를 다시 만져봐야지 하고 만지고 있는데, mongoDB를 연결하고 이 녀석이 제공해주는 오류 때문에 하루를 날렸다. 그렇다고 뭐가 설명이 친절한 것도 아니다 ㅂㄷㅂㄷ
그래서 한 번 시리즈물로 적어본다.

우선 mongodb를 python으로 사용하고 싶다면 이것을 보자.
mongoDB pymongo로 사용하는 docs

djongo 방식으로 연결에 따른 문제?

db와의 소통안됨

내 검색능력이 아주 뛰어나지 못한 탓일까 모든 검색에서 MongoClient(localhost:27017)를 적어놓았다. 그 안에 뭐가 들어가야할지 모르는 나는 따흐흑.... 눈물을 흘리면 검색을 하며 docs를 봐도 안보였다. 나의 시력이 안좋은 탓이다.
이게 djongo 방식으로 연결한 것만의 문제인진 모르겠는데, 일전에 연결을 위해 settings.py에서 database를 수정해주었다.

DATABASES = {
        'default': {
            'ENGINE': 'djongo',
            'NAME': 'your-db-name',
            'ENFORCE_SCHEMA': False,
            'CLIENT': {
                'host': 'mongodb+srv://<username>:<password>@<atlas cluster>/<myFirstDatabase>?retryWrites=true&w=majority'
            }  
        }
}

그럼에도 mongoDB에 연결이 안되길래 뭐가 문젠가 찾아보는 것만도 1시간 걸렸다. ㅂㄷㅂㄷ 찾기 디게 힘들었다.

더 좋은 방법이 있겠지만, 현재 나의 경우엔 다음처럼했다.
내가 사용할 views.py에서 다음을 import 해주었다.

import pymongo
from pymongo import MongoClient

uri ="settings.py에서 사용한 host"
client = MongoClient(uri)
db = client["mongoDB에서 사용하는 database이름"]

으로 연결하고, 이후 내가 views.py안에 있는 def안에서 메서드에 따라서 어떤 테이블을 사용할지 정하도록 하였다.

def example(request):
	if request.method == 'GET':
    	collection = db["사용할 테이블 이름"]

이렇게 하고 난 오 이젠 입출력 수정 삭제만 할 줄 알면 되겠다 했지만, 문제가 생겼다.

입력이 한 번 밖에 안돼!!!!!!!!!!

도대체 뭐가 문젠지 모르겠다.
계속 실패했다. 처음 입력은 정말 잘 돼었는데 그 이후 입력이 안되었다.
처음은 성공했다.
그래서 오 된다 했는데,,,,

이후 부터 계속 안되었다. 왜지...왜지... 왜지... 계속 반복...

이걸로 몇 시간을 잡아먹었다. 검색을 해도 안나온다.

그러다 mongoDB를 직접 하나하나 뒤지면서 설..마?! 하고 꺠달아버린거시여따.

난 model에서 작성하기를 card_num, card_name, card_url만을 사용중이었다. 그런데 이상한 녀석이 내가 "primary_key다" 하면서 있는 것이었다. 난 _id가 그러면 이해가 되는데 이상한 녀석이 그러고 있었다.

이게 원래의 mongoDB라면 있지 않을 문제지만, django와 연결하면서 생긴것일테다. 흑 그래서 난 내가 만들지도 않은 id를 같이 입력하면서, 기입을 해보니 잘 되었다. 이것을 어찌해야하나 고민이 된다. 테스트 django를 다시 만들어서 실험을 또 해봐야할 듯 하다. 따흐흑

이것을 발견하고 나니 insertOne()으로 기입이 안되는 문제는 해결되었다. 문제라고 정확히 말하자면, id 컬럼을 가지고 있고 primary_key로 사용하고 있는데, 이것을 기입안해주니 자동으로 null로 입력했고, 또 기입하려니 마찬가지로 id가 null로 기입이 되어서 작동이 되지 않은 것이다. 이렇게 하나 풀어나간다 흑흑 아오 짜증나.

추가문제

serializer.py에서 fields = 'all'로 했더니, 이놈의 mongoDB가 가진 objectId때문에 serializer문제가 있었다.

TypeError: Object of type ObjectId is not JSON serializable

이건 다른 사람들이 문제를 해결한 것을 보니

data = list(db.find({'info':True},{'_id':False}))
return jsonify({'result' : 'success', 'data' : data})

이런식으로 _id를 제외하거나,

result = list(db.find({}))
for i in result:
i['_id'] = str(i['_id'])
return jsonify({'result': 'success', 'articles': result})

_id 자체를 문자열로 변환시켜주었다.

근데 사실 이건 데이터를 가져올 때나 가능하지 입력할 때는 안되는 거라, 난 왜 문제가 생겼는지 전혀 몰랐다. 3가지 문제가 동시에였걸랑ㅠㅠ

결론

사람들이 주류로 쓰는 것을 따라 쓰자. 흑흑.

profile
반드시 결승점을 통과하는 개발자

0개의 댓글