본문 바로가기

python & django & scipy

(9)
[django] Model 관리 프로젝트 구축하기 문제 회사에서 같은 DB의 모델을 사용하는 django 프로젝트가 3개 정도있다. 적용 전인 반년에서 1년 전까지만 해도 협업 프로세스라는게 존재하지 않았기 때문에 휴리스틱으로 모든 프로젝트를 진행했기 때문에 당연히 특정 django 프로젝트의 니즈에 의해 모델 구조가 변경됐을 때 변경사항이 다른 django 프로젝트에 잘 전달이 되지 않고 있었다. 덕분에 배포 후에 migration 에러가 뜬다던가, 현재는 데이터 분석에도 영향이 있다. 1년 전에는 니즈가 딱히 없었다. 프로덕트 규모 자체가 적었고, 팀도 당시에는 백엔드 개발자가 나 혼자였다(+ CTO님). 필요성은 항상 있었지만, 우선순위가 높은 기술 부채가 아니었다. 그 때에도 어떻게 구현할 지 큰 그림은 있었다. CTO님이 다른 프로젝트도 같이 ..
[django] Model Manager - ORM 정복기 1탄 목차 들어가기 전에, objects? django.db.models.manager.Manager BaseManager Manager Python Descriptor ManagerDescriptor Model의 objects로 설정되는 부분 __new__ -> _prepare -> add_to_class -> contribute_to_class example 숙원 사업(?), ORM이 SQL query를 만드는 과정 항상 엄두를 못내고 수박 겉핥기로 serializer만 뜯어보고 있었던 ORM 회사에서 스터디를 진행하면서 매번 팀원들과 ORM to SQL Query 과정을 뜯어보면 해갈될 것 같다는 말을 반년째 하다가 드디어 스타트를 끊었다 들어가기 전에, django ORM의 기초를 잡고 가보자! 오늘도..
[django] ModelSerializer test code 문제 상황 회사에서 리팩토링 작업을 위해 새로운 프로젝트를 파고, dto와 serializer를 어떻게 구성, 명명, 사용할 것인지에 대한 논의를 하고 있는 중이다. 문제 상황은 아래와 같았다. related field 때문에 항상 다른 serializer를 만들어야 한다. (재사용성이 떨어진다) 어떤 serializer가 어디에서 사용되고 있는지 파악하기 어려워 수정, 제거가 불가능하고 매번 새로 생성한다. 사실 매번 serializer를 생성하는 것 자체는 문제가 아니었다. api별로 필요한 field와 related_field가 다르기 때문에 매번 다르고, 생성해야하는 것은 당연하다. 하지만 재사용성을 충분히 높일 수 있음에도 불구하고 명명 규칙도 제대로 정해지지 않은 상황은 문제이다. 그 과정에서..
[django - google drive api] google drive api로 shared drive(공유 드라이브) 접근하기 [pandas & django] gspread 사용하기 [pandas & django] gspread 사용하기 2022.12.23 - [python & django & pandas] - [pandas] google sheet 에서 데이터 가져오기 [pandas] google sheet 에서 데이터 가져오기 회사에서 google sheet 데이터를 받아온 후 그 데이터로 처리해야하는 일이 있었다. 인 darever.tistory.com 문제상황 저번까지는 구글 시트에 있는 데이터를 dataframe으로 뽑아서 다시 구글 시트로 돌려보내는 것 뿐이었지만 이번에는 일회성 작업 google sheet에서 fdcs라는 field가 true인 상품에 대해 구글 공유 드라이브에 "{sku}_{상품이름}"으로 폴더 생..
[pandas & django] gspread 사용하기 2022.12.23 - [python & django & pandas] - [pandas] google sheet 에서 데이터 가져오기 [pandas] google sheet 에서 데이터 가져오기 회사에서 google sheet 데이터를 받아온 후 그 데이터로 처리해야하는 일이 있었다. 인풋값으로 구글 시트를 다운 받은 엑셀파일을 하나하나 전달받아서 받아와야한다는 점이 불편해서 google sheet darever.tistory.com 이전 글에 이어서 문제상황 데이터를 처리한 후 결과값을 엑셀 파일로 내보내야 했다. input값으로 google sheet를 불러오는 것까지는 했는데, output 데이터를 어떤식으로 줘야하는지가 문제였다. 서버에서 돌려줘야하는 데이터는 input으로 불러온 데이터의 va..
[pandas] google sheet 에서 데이터 가져오기 문제 상황 회사에서 google sheet 데이터를 받아온 후 그 데이터로 처리해야하는 일이 있었다. 인풋값으로 구글 시트를 다운 받아 해당 엑셀파일을 하나하나 전달받아서 받아와야한다는 점이 비효율적으로 느껴져서 google sheet 데이터를 바로 받아올 수 있는 방법이 없을리가 있겠어? 하고 찾아보니까 google sheet 링크를 file_path에 전달하면 됐다. 해결 구글 시트에서 파일>공유>웹에 개시 를 통해 링크를 생성할 수 있다. 원하는 옵션으로 지정하면 된다. csv 파일을 가져오는게 빠르기 때문에 나는 csv 파일로 가져왔다. 공유하고싶은 시트도 지정할 수 있다. 게시를 누르면 생성된 url을 복사할 수 있는데 그 url을 pandas의 read_csv의 file_path로 넣어주면 된..
[django] DB replica 트래픽량이 많아지면 DB에 접근하는 I/O 작업 시간이 길어지기 때문에 Application의 CPU 연산보다 더 큰 bottleneck이 된다. DB 작업은 read, 즉 select가 대부분이기 때문에 read replica를 두어 read는 replica가, write는 master(default)가 하게하면 read 작업을 분산시킬 수 있다. django에서는 multidatabase를 쓸 수 있도록 되어있다. Model.objects.using('{dbname}') Model Manager에서 .using('{dbname}') django.db.router로 DB Router 설정 모든 read 작업이 replica로 가는 것을 처리하기 위해서는 Router에서 db_for_read는 repli..
[python] @property, __init__ 먼저, __new__ 메소드와 __init__ 메소드의 차이를 알아보려한다. 파이썬은 항상 __new__ 가 __init__ 보다 먼저 호출된다. __new__는 인스턴스 객체를 메모리에 할당하고 object를 반환한다. __init__은 인스턴스를 생성하는 것이 아니고 생성된 인스턴스의 멤버 변수를 초기화하고 필요에 따라 자원을 할당한다. __new__의 첫번째 인자에는 cls(클래스)가 들어가고 __init__의 첫번째 인자에는 self(인스턴스)가 들어간다. 파이썬에서는 @property를 사용하면 getter와 setter를 일반 필드로 바로 접근하는 것처럼 사용할 수 있다. class MyClass: @property def title(self): return self._title @title...