라벨이 Django인 게시물 표시

Django update vs bulk_update

함수 QuerySet.update() bulk_update() 예시 MyModel.objects.filter(...).update(field=값) MyModel.objects.bulk_update(objs, ['field']) SQL UPDATE table SET field = 값 WHERE 조건 UPDATE table SET field = CASE WHEN id=1 THEN 값1 WHEN id=2 THEN 값2 END WHERE id IN (1,2) 차이 모든 row에 같은 값 row마다 다른 값 공통점 둘 다 save() 안 탐 pre_save / post_save signal 안 탐

Django 트랜젝션으로 동시성 처리

  조건에 맞는 경우만 처리 Check - then - Act 패턴 if 조건: 처리 잔고가 100원 이상이면 출금 여기서, 조건 확인과 처리는 반드시 하나의 트랜젝션으로 동작해야 한다. 위험! 만약 그렇지 않으면, Read - (gap) - Write 요청과 처리 사이(gap)에 다른 요청이 들어오는 경우. 요청1: 잔고가 100원 이상인가? YES 요청2: 잔고가 100원 이상인가? YES 처리1: 출금 100원, 잔고 0원 처리2: 출금 100원, 잔고 -100원? Django에서는 transaction.atomic 을 사용하여 트랜젝션을 임의로 설정한다. with transaction.atomic():             if 조건검사():                 처리() 그리고 select_for_update 를 사용하여 LOCK을 걸어 다른 요청은 대시킨다. qs = WorkTime.objects.select_for_update().filter(조건들) list(qs) # DB hit를 위해서 이렇게 하면 조건들에 해당하는 row들(qs)에만 LOCK이 걸린다. 트랜젝션이 끝날때 까지. 참고, 읽기만 하는건 LOCK과 무관 MVCC; Multi-Version Concurrency Control

Django 이미 테이블이 만들어져 있다면 inspectdb

  이미 테이블이 만들어져 있다면 inspectdb 명령을 활용하자 python manage.py inspectdb --database interface > myapp/models_if.py 이렇게 하면 interface DB 를 조사하여 자동으로 models_if.py 파일을 만들어준다. 앞으로  Django ORM 으로 테이블을 관리할거면 managed = True 옵션으로 변경해준다.

django queryset distinct on 은 표준이 아니다

  Model.objects.distinct() -> DISTINCT   : SQL 표준 Model.objects.distinct('field') -> DISTINCT ON ('field')   : PostgreSQL 전용, 다른 DB에서는 에러

Django Paginator

  Django 에서는 간단하게 페이지네이션을 구현할 수 있도록 기능이 마련되어있다. from django.core.paginator import Paginator q_page = request.GET.get('page', 1) page_obj = Paginator(object_list, 100).get_page(q_page) 이렇게 하면 설정한 크기로 잘라서 페이지를 만들어준다. (100: 한페이지에 몇줄씩 보여줄지) page_obj.object_list: 페이지로 분할한 결과 리스트 page_obj.has_other_pages: 다른페이지가 있는지 page_obj.paginator.page_range: 페이지 범위 (1~n, range 객체) page_obj.number: 이 페이지의 번호

Django 만료된 세션 삭제

  Django 는 만료된 세션을 기록을 자동으로 삭제해주지 않기 때문에 정리하지 않으면 계속 쌓인다. python manage.py clearsessions 명령으로 삭제 가능하지만, 나는 추후 있을지 모르는 분석자료를 위해 1년치는 보관하기로 했다. 삭제건수 , _ = Session . objects . filter ( expire_date__lt = 일년전 ). delete () log_msg = f '1년 이상된 session 삭제 { 삭제건수 } 건' logger . info ( log_msg )

Django 자동으로 생성된 ContentType, Permission 지우기

상황:  Django 에서 model 을 만들면, 자동으로 ContentType 과 Permission 이 생성되는데, 이후에 modeld 을 지워도 자동으로 지워지지는 않는다. 해결: shell 에서 수동으로 지운다. py manage.py shell from django.contrib.contenttypes.models import ContentType ContentType.objects.filter(app_label='your_app', model='your_model').delete() 결과: (5, {'auth.Permission': 4, 'contenttypes.ContentType': 1}) 연결된 Permission 4개도 함께 지워진다. [보완] 자동으로 지우는 커맨드도 존재한다! python manage.py remove_stale_contenttypes Some content types in your database are stale and can be deleted. Any objects that depend on these content types will also be deleted. The content types and dependent objects that would be deleted are:     - Content type for ㅇㅇㅇ.ㅇㅇㅇㅇㅇ     - 4 auth.Permission object(s) This list doesn't include any cascade deletions to data outside of Django models (uncommon). Are you sure you want to delete these content types? If you're unsure, answer 'no'. Type 'yes' to continue, or 'no' to cancel: