본문 바로가기

Django

(11)
Django 속이기 - migration 파일 직접 수정 models.py를 수정한 뒤 makemigration을 했을 때 이런 메세지가 뜰 수도 있다. You are trying to add a non-nullable field to without a default; we can't do that 어쩌구 이미 있는 model class에 non-nullable인 필드를 추가하면 이런 일이 생긴다. datetime 필드를 추가한 뒤 나왔던 메세지와는 조금 다르다. 그 때는 기존에 존재하는 데이터에게 어떤 시간을 채워넣을까 하는 메세지였는데, 이건 데이터베이스를 이미 삭제한 뒤여도 나온다. 동기들에게서 들은, default를 안 주고 해결하는 방법은 두가지였다. 1. null=True를 주고 만들고, not nullable한 필드를 만들고 싶다면 기존 데이터의 ..
DateTimeField를 추가할 때 데이터의 생성 일시와 수정 일시를 저장할 땐 대개 아래 두가지를 사용한다. auto_now_add는 최초로 생성할 시에만 들어가고, auto_now는 저장될 때마다 업데이트 된다. 둘 다 직접적으로 건드릴 수 없다.(editable=False) created_at = DateTimeField(auto_now_add=True) updated_at = DateTimeField(auto_now=True) 이런 column은 당장 사용하지 않더라도 확장성을 고려하여 나중에 필요할 법한 곳에 미리 추가해두는 게 좋다. DB에 이미 저장되어 있는 데이터가 있는데 DateTimeField를 추가하고자 한다면 이 column에 값을 채워넣어야 되기 때문에 아래와 같은 메세지가 나온다. 3을 선택해서 나간 뒤 model..
DB에 csv로 초기 데이터 넣기 장고 프로젝트의 settings.py에 들어가는 데이터베이스 정보는 자신의 로컬 DB에 대한 정보이다. AWS에 DB서버를 올려두고 쓰는 환경이 아닌 이상 팀원들이 가지고 있는 DB는 다 다른 것이고, 안에 들어있는 정보도 다르다. 로직을 테스트하기 위해서라면 방드시 같은 정보일 필요는 없지만, 텅 빈 DB에 새로 데이터를 손수 채워넣는 건 매우 귀찮다. 특히 레퍼런스 테이블이 존재하거나 이리저리 fk가 얽혀있는 모델에 데이터를 넣으려면 어디에 무얼 먼저 넣어야 되는지 신경쓸 게 많다. csv파일로 미리 만들어 둔 데이터를 공유하고 이를 각자 DB에 넣으면 이런 불편이 상당부분 해소된다. 한 사람의 DB에 데이터를 쳐넣고 이를 백업 떠서 sqldump 파일을 공유하는 방법도 있겠지만, 처음 데이터를 넣는..
django.db.utils.IntegrityError: NOT NULL constraint failed 메세지만 읽어도 nullable하지 않은 데에 값을 안 넣었구나 싶은 에러다. 설 연휴 때 장고 책을 보고 따라하다 save(commit=False)를 기억하기 위해 일부러 내 보았다. 참고한 장고 책에서는 not null인 생성일 데이터를 timezone.now()로 직접 입력하게 안내했다. 하지만 나는 책을 따라가는 초반부터 auto_now_add 속성을 사용해 생성일을 자동으로 넣게 만들었으므로 다른 테이터를 가지고 연습했다. 질의응답 게시판의 답변은 반드시 질문을 참조해야 되는 모델을 만들었다. 따라서 답변의 question이 not null이어야 한다. def answer_create(request, question_id): question = get_object_or_404(Question, ..
TemplateSyntaxError: 'pybo_filter' is not a registered tag library 설 연휴 때 장고 책을 보며 템플릿 필터를 만들다 난 에러다. 시도와 해결을 기록하고자 글로 남긴다. 에러가 나기 전에 한 것 1. app directory 아래에 templatetags 폴더 생성 2. 이 폴더 안에 pybo_filter.py 파일 생성 3. 파일 내용은 이 링크를 참고 4. templates/pybo/question_list.html 파일에 만든 파일을 load 5. 이미 돌아가고 있던 서버. 페이지를 새로고침 함 -> {% load pybo_filter %} 라인에서 에러가 발생했다. 시도 1. 서버 끄고 다시 켜기 혹시나 해서 해봤다. 서버를 재시작하니 에러 이름이 바뀌었다. AttributeError: type object 'Library' has no attribute 'tag..
백엔드 서버 되어보기 Django로 프로젝트를 생성, app을 만들고 models.py, views.py, urls.py를 작성하여 엔드포인트를 생성했다. 이제 프론트엔드가 클라이언트가 되어 여기로 요청을 보내고 응답을 받아갈 수 있다. 터미널에서 혼자 서버 켜고 다른 터미널에서 httpie를 사용하여 테스트하던 것과 다른, 진짜 누군가와 주고 받는 통신이다. views.py에있는 클래스 안에 POST, GET method가 있고 이 method가 갖는 argument로 request가 있다. 프론트가 요청을 보내면 이 request로써 들어오고, 필요한 정보를 추출해 DB에 반영하는 등의 로직을 거친다. 응답을 보낼 땐 method와 설정해둔 응답의 유형에 따라 status code만 보내기도 하고 header나 paylo..
Django 회원가입, 로그인 엔드포인트 인스타그램의 기능을 한 가지씩 만들어보는 westagram 프로젝트를 진행중이다. 첫 단계는 회원가입과 로그인이다. 원래 회원가입 엔드포인트와 로그인 엔드포인트 블로그 글을 따로 쓰려 했는데, 에러 처리 면에서 전자가 후자를 포괄한다고 볼 수 있어서 글을 수정했다.(만들면서 쓸 걸 나중에 쓰니까 번거롭다...) 회원가입 조건 필수 사항: email, password email에는 '@'와 '.'가 반드시 포함되어야 함. password는 8자 이상. user/models.py from django.db import models class User(models.Model): email = models.CharField(max_length=30) password = models.CharField(max_le..
django.db.utils.OperationalError: (1054, "Unknown column 'menu_id_id' in 'categories'") 처음 models.py를 만들 때 categories 테이블에 들어갈 ForeignKey의 이름을 잘못 주었다. ForeignKey는 장고가 알아서 _id를 붙여 column name을 주는데, 이름 자체에도 _id를 붙여 migrate한 바람에 column name이 menu_id_id 이렇게 만들어졌다. 그래서 일단 수정하고 그 뒤 작업을 계속했다. 이 때 잊은게, makemigration은 하고 migrate를 안 했다... runserver할 때 migrate를 하라는 경고가 떴지만 이것저것 바꾸고 있으니 조금만 있다가 하자, 하던게 쌓이고 쌓여... 오늘은 migrate를 해야겠다 생각하고 $ python manage.py migrate를 했는데 에러를 보고 예상은 했지만 어디서 문제가 났는지 ..
Django CRUD - QuerySet API $ python manage.py shell 이 쉘은 장고를 통해 연 쉘이라 장고는 이미 import되어 있다. models.py 내의 필요한 class를 import해야 된다. >>> from .models import 이렇게 import하고 나면 해당 class들을 사용할 수 있다. CRUD (Create, Retrieve, Update, Delete) 데이터를 처리하는 4가지(생성, 조회, 업데이트, 삭제) 방식이다. 장고의 DB는 장고가 제공하는 ORM을 사용해 Model의 class 기반 객체로 맵핑할 수 있다. View에서 QuerySet method를 이용해 작성한 로직대로 이 객체에 접근해 CRUD 작업을 할 수 있다. 이 때 객체가 메모리에 할당되어 소프트웨어에 실체화 된 것을 insta..
Django - models.py 장고 내에 app을 만들면 models.py, views.py 등이 들어있는 app 폴더가 생긴다. Web 2.0 기준이라면 이 app을 기능마다 만들겠지만 3.0은 entity를 기준으로 한다. 데이터의 성격을 보고 이게 상품 관련인지, 사용자에 관련된 건지에 따라서 묶인 단위가 entity이다. models.py에 쓰는 class는 곧 DB의 table이다. class 안에 = models. 형태로 column을 넣는다. field로 줄 수 있는 것들 중 하나가 ForeignKey인데, column명으로 준 거에 장고가 자동으로 _id를 붙인다. 그리고 참조할 테이블의 class와 참조했던 게 사라졌을 때 어떻게 처리할 건지를 attribute로 줘야 된다. 참조할 테이블의 class명은 따옴표를 붙..