인코스런 2기
커머스 프로젝트 4주차 WIL
B1001101
2022. 7. 10. 23:50
DRF
perform_create()
- Django Generic View에서 제공하는 메소드
- serializer의 create() 메소드의 일부분을 오버라이딩할 때 사용
- serializer.save()가 호출될 때 perform_create()가 호출됨
- object의 특정 속성을 자동으로 설정해야 할 때 유용
- https://www.django-rest-framework.org/api-guide/generic-views/
- https://jomuljomul.tistory.com/entry/Django-REST-Framework-create-vs-performcreate
lookup_field
- id 말고 다른 필드로 오브젝트를 찾고 싶을 때 사용
- View랑 Serializer 둘 다 설정해줘야 함
- https://www.django-rest-framework.org/api-guide/generic-views/
User 모델 username 필드 verbose_name 설정
- AbstractBaseUser 상속받은 후 USERNAME_FIELD 직접 지정
- UserManager 직접 구현 후 User 모델의 objects에 커스텀 매니저 지정
- create_user, create_superuser 메서드 재정의
- https://kimdoky.github.io/django/2018/11/26/django-username-verbose/
Django에서 request header 값 가져오는 방법
- header 정보는 request.META에 저장되어있음
- request.META.get() 사용하면 키값이 없어도 에러 방지할 수 있음
- https://velog.io/@16616516/django-request-header-%EB%A1%9C-%EA%B0%92-%EC%9D%BD%EA%B8%B0
get_object()
- RetrieveAPIView에서 get_object() 메소드를 오버라이딩하면 파라미터로 pk 줄 필요 없음
- self.request로 요청 정보 접근 가능
- Me API 구현할 때 유용
- https://stackoverflow.com/questions/57849475/how-to-do-put-request-without-primary-key
Database
Transaction
- @transaction.atomic 데코레이터를 사용하면 해당 블록에서 예외가 발생했을 때 데이터베이스 변경사항이 rollback 됨
- https://docs.djangoproject.com/en/4.0/topics/db/transactions/
Migration 에러 났을 때 해결방법
- makemigrations부터 에러가 나서 아예 migration 파일을 생성할 수 없는 경우: migration보다 먼저 실행되는 top level query가 있는지 확인
- print(queryset)같은 코드가 있으면 migration보다 먼저 실행되어서 에러가 발생
- https://stackoverflow.com/questions/46664596/makemigrations-error-django-db-utils-operationalerror-no-such-table
- 다른 앱의 테이블에 종속되어 있어서 충돌이 일어나는 경우: 앱 별로 migration 진행
- 먼저 생성되어야 하는 앱부터 순서대로 실행
- migration 적용 상태 확인하는 커맨드: django manage.py showmigrations
- 이미 migrate된 항목을 취소하고 싶은 경우: 데이터베이스에서 django_migrations 테이블을 찾아서 직접 기록 삭제
- https://daeguowl.tistory.com/138
PostgreSQL 연동
Admin
Admin 페이지 custom filter
- admin.SimpleListFilter 사용
- https://docs.djangoproject.com/en/dev/ref/contrib/admin/filters/
Admin 페이지 검색기능
- search_fields에 검색에 포함할 필드를 추가
- '=필드명': 정확히 일치, '^필드명': 앞에서부터 일치
- Related Field로 검색: '필드명__하위필드명'으로 접근 ex) user__email
Calculated Field에 Boolean 아이콘 적용
- 필드명.boolean = True 추가
- https://stackoverflow.com/questions/12842095/how-to-display-a-boolean-property-in-the-django-admin
Excel 파일로 내보내기
- django-import-export 라이브러리 사용
- https://django-import-export.readthedocs.io/en/latest/index.html
get_object_or_404()
- 오브젝트가 존재하지 않을 때 Http404 예외 발생시킴
- https://developer-ankiwoong.tistory.com/956
기타
주문번호 생성하기
- Python DateTime 오브젝트를 String으로 변환: strftime() 사용
https://www.programiz.com/python-programming/datetime/strftime - int를 sting으로 변환할 때 leading zero 붙이기: zfill() 사용
https://blog.finxter.com/python-int-to-string-with-leading-zeros/
프론트엔드(React)에서 백엔드(Django)로 이미지 보내는 방법
- FormData 형태로 전송
- 이미지 파일은 request.FILE에 담겨서 전송되므로 Serializer 필드가 없어도 받을 수 있음
- 여러 이미지를 한 번에 보내려면 같은 키값을 사용하면 리스트 형태로 전송됨
- 인코딩하여 String 형태로 전송
- 프론트에서 AWS S3에 업로드한 후 URL 주소만 전송 (presigned url 사용)