django 17

TypeError: 'Manager' object is not callable 발생 시 objects를 확인하자

TypeError: 'Manager' object is not callable 에러를 몇 번 봤다. 왜 계속 같은 실수를 하는 지 모르겠다. 저 에러를 보면 왠지 Manager 관련해서 손을 좀 봐줘야 할 것만 같다. ModelManager를 만든다든지. 하지만 절대 아니다. 나는 항상 저 에러를 발견할 때마다 내가 objects를 잘못 썼다는 것을 알았다. objects는 모델의 속성이다. objects()가 아니다. 즉 함수가 아니다. 잘못된 코드 review = Review.objects().only('watch').get(id=review_id) 올바른 코드 review = Review.objects.only('watch').get(id=review_id)

django 2021.02.11

django query 최적화 시키기 - prefetch_related

흠... query에 연결은 1번만 하지만 10 simillar가 거슬린다. 최적화시켜 본다. 우선 query 가져오는 시간부터 살펴봤다. 데이터 10개 가져오는데 8.97ms나 필요하다. 개선이 필요해 보인다. 일단 인덱스 페이지에서 나는 info만을 필요로 한다. Review.objects.order_by('-create_date')[:5] 그래서 위 코드를 아래처럼 Review.objects.only("info").order_by('-create_date')[:5] info 관련 필드만 가져오게 수정했다. only() 사용만으로도 5.99ms로 줄어들었다. 새로고침 해보니까 같은 코드임에도 매번 다른 시간이 걸린다. 이 시간에 크게 연연하면 안 되겠다. 하지만 아직도 거슬린다. 10 similar ..

django 2021.02.11

visual studio code 쓰면 python manage.py runserver 안 쳐도 된다

django 서버 켤 때마다 python manage.py runserver를 입력하는 건 고통이다. visual studio code 쓰면 디버그 기능을 통해 수고로움을 덜 수 있다. .py 파일 하나 켜 놓고 디버그 버튼(벌레 그림)을 누른다. launch.json 파일 만들기를 눌러야 나중에 F5로 바로 진입 가능하다. 아래에서 Django를 누르면 자동으로 python manage.py runserver를 실행해준다. 설정 후에는 F5를 단축기로 사용하면 된다.

django 2021.01.31

visual stuido code 파이썬 가상환경 설정부터 startproject까지

django 프로젝트에는 가상환경이 거의 필수이다. 까먹음 방지를 위해 가상환경 설정법을 기록한다. 일단 프로젝트 폴더를 편집기에서 연다. visual studio code 내에 있는 터미널에 python -m venv env 해당 코드를 입력한다. (간혹 powershell로 터미널이 설정되어 있다면 안 되는 경우가 있다. 이런 경우 기본 셸 선택을 cmd로 바꿔보자.) 그러면 이런 팝업이 뜰텐데 Yes를 눌러주자. ctrl + shift + p를 눌러서 select Interpreter를 검색한 뒤 클릭한다. 이 중에서 env(맨 위에서부터 3번째)를 클릭한다. ctrl + shift + ` 를 누른다. 재접속 했을 때에도 해당 단축키를 눌러주자. 바로 (env)가 안 뜨면 select interpr..

django 2021.01.31

django serializer로 foreign key 관계의 원하는 값들을 가져오는 방법

post를 비동기 방식으로 json 객체로 받아오기 때문에 author의 user name이랑 author의 프로필 사진을 같이 받아올 필요성이 있었다. serializer의 기본 설정을 사용한다면 foreign key 관계인 author는 id만 가져온다. 그러나 아래처럼 natural_key를 설정해주면 특정 필드 값들을 원하는 만큼 tuple로 리턴해줄 수 있다. rest framework 없이도 가능하다. class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) pic = models.ImageField(default="profile-default.svg") friend = models.ManyT..

django 2020.12.29

순수 django + vue template을 사용하여 비동기로 게시물 불러오기, 좋아요 처리

vue.js의 template을 사용하니 document element를 직접 찾고 조작해주는 과정이 없으니 편하다. 다만 vue.js에 익숙하지 않아 vue적인 사고를 하기까지가 어렵다. {% extends 'my_book/base.html' %} {% load static %} {% block style %} {% endblock %} {% block content %} {% include 'my_book/navbar.html' %} 게시물 작성 {% csrf_token %} {{ form.content }} 로딩 중..... 사용자 [[ post["fields"].author ]] [[ post["fields"].created_date ]] [[ post["fields"].content ]] 좋아요..

django 2020.12.28

현재 user를 필드 값으로 넣고 싶을 때

class Post(models.Model): content = models.TextField() author = models.ForeignKey(User, on_delete=models.CASCADE) created_date = models.DateTimeField(auto_now=True) likes = models.PositiveIntegerField(default=0) class Meta: ordering = ['-created_date'] 이와 같이 Post 모델을 만들었다. post 작성 form에서 author 필드는 보여져서는 안 된다. 보여진다면 자신이 아닌 다른 user의 이름으로 게시물을 작성할 수 있게 된다. 1. 처음에는 요행으로 문제를 해결하려 했다. author 필드를 form..

django 2020.12.28

django에 react나 vue를 결합시켜야 하는가?

django의 기본을 익히고 사용해 보니 비동기 처리에 대한 갈증이 생겼다. 공식 문서에도 ajax 언급이 존재하니 ajax를 사용하면 된다. 하지만 jquery ajax를 사용하여 DOM을 조작하면 코드가 꽤나 길어진다고 생각한다. 그래서 프론트엔드 프레임워크나 라이브러리를 알아보게 됐다. 많은 경우 react + drf 조합으로 프로젝트를 한다. 프론트엔드 개발자가 존재하는 팀이면 모르겠지만 html, css, js에 관한 지식만 있는 1인이 django를 사용하여 개발하는 경우 react를 공부하는 건 비효율적이다. (취업문 앞에 서면 얘기가 달라질 지 모르겠지만 적어도 빠르게 프로덕트를 내놓는 관점에서는) 기존 django에서 제공하는 기능들을 잘 활용하는 효율적인 페이지 라우팅 방법을 찾아 헤맸..

django 2020.12.25

[프로젝트 고전][django] TODO 프로젝트

개발 초기에는 누구나 만들어본다는 TODO 앱을 만들어봤다. javascript를 사용해서도 만들 수 있겠지만 데이터에 기반해서 django 프레임워크로 만들어봤다. django 튜토리얼(공식 문서에 있는 polls 튜토리얼 혹은 djangogirls 튜토리얼)을 만들어본 사람은 간단하게 만들어보면 django 복습에 도움이 된다. model도 너무 간단하다. 다른 데이터 테이블이랑 연결되어 있지도 않다. django 공부를 시작한 사람이 혹시 이 글을 보게 된다면 django 연습문제 삼아 풀어보면 도움이 된다. 기본적으로 만료일이 얼마 안 남은 일정부터 위에 나오게 했다. (같은 색 카드 내부에서도) 만료일이 접속 날짜 이전이면(이미 기한이 지났으면) 빨간색 사각형 안에 들어가게 했다. 접속한 날짜 ..

프로젝트/TODO 2020.12.23

현재 html에서 필요한 css 파일만 불러오기

{% load static %} {% block content %} {% endblock %} 이처럼 뼈대가 되는 템플릿의 head 태그에 blcok을 설정해준다. 뼈대를 이용하는 다른 템플릿에서 {% load static %} {% block style %} {% endblock style %} block style 부분에 필요한 css를 넣어주면 된다. 단, {% static %} 태그를 사용하기 위해서는 {% load static %}도 적어줘야 한다. 브라우저의 개발자 콘솔을 통해 확인해본 결과 필요한 css 파일만 서버에서 잘 가져오고 있다.

django 2020.12.23