Contents 1. 배경 장고에서 User역할을 하는 app을 따로 생성한 뒤, SignUp을 CreateView를 상속받아 사용할 수 있습니다. 이때, form_class로 UserCreationForm을 이용하면 아래와 같은 [Manager isn't available; 'auth.User' has been swapped for 'accounts.User'] 에러가 발생합니다. 원인과 이를 해결하는 방법을 알아보겠습니다. 2. 해결 1) 원인 저는 User를 accounts라는 app으로 새로 만들었습니다. settings.py에 AUTH_USER_MODEL = "accounts.User" 도 잘 추가해 줬습니다. 그런데 SignUpVIew에서 form_class로 사용하는 UserCreationF..
Contents 1. 배경 장고에서 데이터를 불러오는 방식은 ORM의 Lazy-Loading을 기본으로 하고 있습니다. 이는 데이터가 필요한 시점에, 알맞은 쿼리를 최적화해서 DB에 날리는 방식입니다. 일반적으론 이 최적화가 잘 작동해서, 알아서 최소한의 쿼리만 날립니다. 하지만, 몇몇 경우에서 N번 쿼리를 더 날리게되는 N+1 문제가 발생합니다. N+1 문제의 예시를 보겠습니다. 첫째로, 다른 테이블의 데이터에 접근할 때, 이미 쿼리를 날렸는데, 원하는 정보가 없는 경우 N번에 걸쳐 반복하며 쿼리를 날리게 되는 경우입니다. 또 다른 예로는, N개의 데이터에 대해 명시하지 않은 필드에 접근할 때도 처음에 쿼리를 날리고, 이후에 필드가 없다 보니 N번에 걸쳐 추가적인 쿼리를 날리는 문제를 의미합니다. 이 ..
# 콘솔창에서 SQL 쿼리 보기 LOGGING = { "version": 1, "disable_existing_loggers": False, "handlers": { "console": { "level": "DEBUG", "class": "logging.StreamHandler", }, }, "loggers": { "django.db.backends": { "handlers": ["console"], "level": "DEBUG", }, }, } Contents 1. 배경 장고에서는 DataBase API로 ORM을 쓰기 때문에 실제 사용할 때, SQL 쿼리가 어떻게 동작하는지 알고 싶은 경우가 많습니다. 특히 특정 기능에서 속도가 느린 경우, SQL 쿼리가 어떻게 되는지 먼저 확인하면 매우 좋습니다. ..
Contents 1. 배경 python manage.py startapp 으로 앱을 만들었다면, django settings.py에서 해당 app을 등록해야 합니다. INSTALLED_APPS라는 리스트에 작성함으로써 앱을 등록하는데요. 어떨 때는 app이름만 작성하고, 어떨때는 app이름.apps.Config 형식으로 작성합니다. 어떤 차이가 있을까요? 2. 해결 python manage.py startapp blog라는 앱을 만들었습니다. blog의 apps.py를 보면 아래와 같습니다. 상위에 BlogConfig라는 클래스가 있습니다. INSTALLED_APPS리스트에 "blog.apps.BlogConfig"를 등록하는 것은 정확히는 blog폴더의 apps.py의 BlogConfig 클래스를 등록한..