Django ORM - update 와 get 처리 한번에

카운터를 1 증가하고 얼마가 되었는지 다시 쿼리해서 읽어보면 한 쓰레드로 동작하는 경우에는 생각하는 대로 증가한 값을 볼 수 있다.

근데 동시에 4개의 요청이 들어와 있는 상태에서 증가하는 것은 transaction.atomic 머 이런걸로 처리한다 하더라도 다시 쿼리 날려서 읽는 동안 여러놈이 증가를 시켰으면 읽은 값은 내가 증가한 값이 아니라 최종 값이 읽혀져서 문제다.

 

역시 udpate and get 을 한번에 하는게 좋은데, Django ORM의 update 는 리턴값이 그냥 id 값인듯 하다.

답은 있지 rawquery를 이요하는것.

 

내가쓰는 DB가 PostgreSQL 이니까 여기에 맞는

https://stackoverflow.com/questions/60026615/how-to-get-and-update-django-object-in-one-query

 

How to get and update Django object in one query?

To optimize a lot my database I would like to make as less as possible any query. I'm trying to get an object, increment the field "count_limit" and make an If statement after on the Customer inst...

stackoverflow.com

query = 'UPDATE customer SET count_limit=(customer.count_limit + 1) WHERE customer.user_id=%s returning *'
updated_obj = Customer.objects.raw(query, [user.id])

 

너무 쉽지 여기서 리턴되는 rawqueryset 을 읽는 방법은 아래 글에서 참고

2022.07.20 - [Django] - Django - rawqueryset 필드 접근

 

Django - rawqueryset 필드 접근

부득이하게 raw query 로 접근하는 경우가 있다. 이때 리턴되는 값은 일반 queryset 하고 좀 다른듯 암튼 필드 접근은 당연히 해야 하니깐, 받은 objs 가 리스트 형태로 저장되어 있어서 iteration 해서 값

kblck.com

끝.

한잔해 원샷

Pexels에서 Arthur Brognoli님의 사진: https://www.pexels.com/ko-kr/photo/2440528/