django 19

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 최적화 시키기 - update는 비동기로

def get_object(self): review = super().get_object() # 조회수 1 증가 review.watch += 1 review.save() return review 이와 같이 객체를 가져와서 속성을 변경한 뒤 저장(update)을 하는 로직이다. 그런데 무려 4ms나 걸린다. 어떻게든 줄여야겠다는 생각이 든다. DetailView라서 watch 속성만 가져오는 건 불가능하다. name을 비롯해 여러 속성이 보여야 한다. 생각을 해보다가 마땅한 방법이 없어서 celery가 나중에 처리해주는 방식을 선택했다. 덕분에 update query 작업이 없어져서 6ms -> 2ms로 로딩 속도를 줄일 수 있었다. def get_object(self): review = super().g..

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

django rest framework pagination 안 되는 문제 해결

django rest framework 사용 중 페이지네이션 기능을 원했지만 APIView나 GenericApiView 사용 시 자동으로 pagination이 되지 않고 queryset 전체를 한 번에 가져왔다. 물론 pagination_class도 코드에 포함했었다. 아래는 공식 홈페이지에서 발췌한 글이다. GenericApiView는 자동으로 페이지네이션을 안 해준단다. 그래서 viewsets를 사용했더니 자동으로 response에 page_size만큼 데이터를 전달해준다. previous 링크랑 next 링크 주소도 전달해줘서 api로 사용하기에 손색이 없다. 처음에는 apiview라는 이름이 안 들어가서 apiview 방법을 고집해봤지만 쉽게 해결이 안 돼서 viewsets를 사용했는데 api랑 ..

django 2021.02.07

[윈도우] celery가 작동을 안 하는 이유, 해결책

너님 run()만 호출하고 왜 일을 안 하세요?????? celery 공식 문서를 봤었지만 celery 4.0부터 윈도우 운영체제를 지원 안 하는 줄 몰랐다. 그러나 stack overflow에서 해결책을 찾을 수 있었다. gevent 패키지를 설치하고 pip install gevent 아래 명령을 실행하니 열심히 일을 한다. celery -A config worker -l info -P gevent 현재 config 폴더에 celery.py 파일이 있어서 worker 앞에 config를 입력했다. 참고자료 stackoverflow.com/questions/37255548/how-to-run-celery-on-windows

django 2021.02.03

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