α. 기타 Django 상황들(VsCode, 오류 등)
1. django-admin command not found
100프로의 확률로 Django가 깔려있지 않아서 생기는 현상이다.
여기서는 bubble 이라는 개념을 알아야한다.
가상환경은 하나의 폴더 안에 생기는 것이다. 즉, a라는 폴더 가상환경에 Django를 설치하면 b라는 폴더 가상환경에는 Django는 없는것이다. 이때 하나의 가상환경을 bubble(shell)이라 말한다.
Pycharm이 좋은것은 애시당초 가상환경을 만들고 Django가 깔린 상태로 해준다는 것.
만약, vs를 사용한다면 가상환경을 만들고 Django를 직접 깔아줘야한다.
For VsCode
설정한지 꽤 오래되서 기억이 가물가물한데 우선 pipenv를 깔아준다.
따라서 오류가 있을수 있으니 참고용으로만 해주길 바란다. 추후에 직접 다시 해보고 수정하겠다.
https://pipenv.pypa.io/en/latest/
Pipenv: Python Dev Workflow for Humans — pipenv 2022.5.3.dev0 documentation
Pipenv: Python Dev Workflow for Humans Pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, yarn, etc.) to the Python world. Windows is a first-class citizen, in our world. It automatically creates and manage
pipenv.pypa.io
다음 comand창에 원하는 폴더로 접속을 하고
brew install pipenv #pipenv 설치
pipenv --three #python 3버젼 설치
pipenv shell #프로젝트 가상환경 진입
을 해준다. 이러면 가상환경에 진입한것이다.
다음으로 Django를 설치하고 프로젝트를 생성한다.
pipenv install Django==4.0.2 # 장고 설치
django-admin # 장고 설치 확인
django-admin startproject config # 장고 프로젝트 생성
이때 django-admin이 오류가 나오면 설치가 안된것이다. 아니면 powershell이 아닌 pipenv shell에 쳐보길 바란다.
Pycharm
파이참은 다른 페이지에 써져있는대로 파일이 정상적으로 설치되었으면 문제가 없다.
https://softl.tistory.com/97?category=559456
1. Pycharm으로 Django 프로젝트 생성
1. File/New Project/Django 여기서 주의할 점은 프로젝트의 (폴더) 이름 즉, C:\Users\USER\Desktop\sparta\djangoProject에서 djangoProject가 django가 되면 안된다. 이유인 즉슨, 기존 파이썬 모듈이랑 이름..
softl.tistory.com
하지만 그럼에도 django-admin이 안된다면 문제는 하나다.
terminal이 잘못된 bubble(shell)을 가리키고 있는 것이다.
이를 확인하기 위해서는 settings/terminal에 들어간다.
원래 powershell로 되어도 가능한데 만약 문제가 있다면 powershell 옆에 🔻눌러서 cmd로 바꿔주자
그러면 오류를 해결하기 더 편하다.
이유인 즉슨 powershell의 경우에는 가상환경에 들어와있는지 여부를 표시를 안해준다.
하지만 cmd의 경우에는 가상환경에 들어가면 왼쪽에 괄호 치고 가상환경 이름을 보여준다.
따라서 가상환경에 들어갔는지 안들어갔는지 확인하기 더 용이하다.
Tmi. powrshell이 cmd보다 더 많은 명령어를 가지고 있다.
2.ValueError: Related model 'user.user' cannot be resolved
앞서 학습을 하면서 UserModel을 만드는 일이 있었다. 이때 UserModel보다는 Model없이 사용한다고 하여 제거를 했는데 아래와 같은 에러가 떴다.
ValueError: Related model 'user.user' cannot be resolved
그도 그럴께 이미 장고에서는 Users가 기본적으로 만들어져 있다. 그러니 이번에는 우리가 한발 뒤로 물러서서 다시 UserModels로 바꿔주자.
2-1. ValueError: Related model 'user.user' cannot be resolved 해결 안되는 이슈
당연히 그럼에도 오류가 날것이다.
결론부터 말하면 모든 migrations 파일이랑(__init__.py 제외) db를 지우는 것을 추천한다.
#리눅스 명령어이다
#그냥 손으로 지우는게 더 빠르지 않을까 싶다
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find -path "*/migrations/*.py" -not -name "__init__.py" -delete
그 이유는 오히려 해당 에러는 migrations파일을 수정하다가 일어날 경우가 많기 때문이다.
우선 들어가기 앞서서 makemigrations와 migrate의 차이를 알 필요가 있다.
1) makemigrations
쉽게 말하면 바뀐것을 찾는것이다. 그리고 바뀐 내용을 000X_initial.py에 저장한다.
# Generated by Django 4.0.4 on 2022-05-26 09:21
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('tweet', '0001_initial'),
]
operations = [
migrations.RenameField(
model_name='tweet',
old_name='author',
new_name='authors',
),
]
위를 보면 old_name, new_name을 통해 tweet의 0001_initial.py에서 author이 authors로 바뀐것을 알 수 있다.
그러나 이는 db에 적용되는 것은 아니다.
2) migrate
migrate가 db에 적용시키는 과정이다.
3) db, migrations 파일을 전부 제거해야되는 이유
- db는 삭제한 파일과 새로 생선된 파일을 구별을 못한다. 예를 들어서, 0002_initial.py를 제거하고 다시 만들면 0001_initial.py가 있기때문에 0002_initial.py가 생성될 것이다. 하지만 db에는 이미 0002_initial.py가 migrate된 기록이 남아있다. db 입장에서는 새로 생성된게 아닌 원래 있던 파일이 된다.
- migrtations파일에 table(models.py에 있는 내용으로 여기서는 author이 해당된다.)을 지우라는 명령이 있는데 db에는 해당 table이 없으면 db는 없는것을 삭제하기 때문에 오류가 날것이다.
4) 마무리
결론은 많이 해보면서 에러를 안나게 하는게 최선이고 안된다면 전부 지워서 초기화 해야한다.
3. You are trying to add a non-nullable field '필드명' to post without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.pySelect an option:
Django migration 오류
field를 추가/수정했을 때 나오는 오류로 기존에 있던 객체들이 새로운 field에 어떠한 조치를 취하는지 물어본다.
1)은 Django에서 지정해주고 2)는 개인적으로 지정할때 선택한다.
4. DateTimeField insert error : received a navie datetime
from datetime import datetime
date_str = "2020-06-15 20:01:25"
v = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
해당 형식에 맞춰서 넣어주면 Django가 읽어준다.