모든 코드들을 이야기하는 것보다 효율적으로 작성한 코드 혹은 새롭게 작성한 코드들을 위주로 포스팅을 하는 것이 좋을 것으로 판단하여 그러고자 한다. 전체 코드는 여기에서 확인할 수 있다.
- get_or_create() 활용
get_or_create()는 Django에서 object를 주어진 parameter를 검색하여 존재하면 관련한 정보를 가져오고 없으면 주어진 parameter로 object를 생성하는 method이다. 관련한 document는 여기에서 확인이 가능하다. get_or_create()은 parameter를 가진 object가 있으면 object를 가져오고 object가 없으면 주어진 parameter로 객체를 만든다. 아래는 document에서의 예시이다.
본 프로젝트에서는 1. 유저가 회원가입 하는 경우, 2. Crawling product를 생성하는 경우에 사용되었다.
유저가 회원가입을 처음하는 경우, 즐겨찾기를 자동으로 생성시키고 혹은 유저가 db에 존재하는 경우, 유저의 즐겨찾기를 가져오게 된다. 다시 말하자면, 있으면 유저 데이터를 가져오고 없으면 유저 데이터를 만든다. 작성된 코드는 아래와 같다. 코드가 사용된 부분만 공유할까 했지만 맥락상 다 가져와야된다고 판단하였다.
/api/user/serializers.py
class UserSerializer(serializers.ModelSerializer):
addresses = AddressSerializer(many=True, read_only=True)
filters = FilterSerializer(many=True, read_only=True)
posts = PostSerializer(many=True, read_only=True)
class Meta:
model = User
fields = ['phone_number', 'nickname', 'profile_image', 'addresses', 'filters', 'posts']
extra_kwargs = {
'phone_number': {'validators': []},
}
def validate(self, data):
#user를 기입한 핸드폰 번호로 찾고 없으면 기입한 핸드폰 번호로 user 생성
user, is_created = User.objects.get_or_create(phone_number=data["phone_number"])
#생성되었다면 subcategory 생성
if is_created:
subcategory_ids = Subcategory.objects.filter(category_id=1).values_list('id', flat=True)
Filter.objects.bulk_create(
[Filter(user_id = user.id, subcategory_id = id) for id in subcategory_ids]
)
payload = JWT_PAYLOAD_HANDLER(user)
jwt_token = JWT_ENCODE_HANDLER(payload)
update_last_login(None, user)
results = {
'access_token' : jwt_token
}
return results
- bulk_create() 활용
bulk_create()는 한번에 대량의 레코드를 생성할 때 사용한다. 반복문을 통해서 한번에 하나씩 생성하는 방법보다 코드가 짧아지고 서버에 부하를 안주면서(반복문의 경우, 매 요청마다 insert 요청을 계속하기 때문에..) 데이터를 생성할 수 있다. 관련한 document는 여기에서 확인이 가능하다. 아래는 Document에서의 예시이다.
api/user/serializers.py
Filter.objects.bulk_create(
[Filter(user_id = user.id, subcategory_id = id) for id in subcategory_ids]
)
생각보다 많은 리펙토링을 진행하지는 못했지만 Django는 정말 사용자의 편의를 많이 봐주는 것 같다. 나아중에 다시 이 프로젝트를 보면 정말 아마추어같았구나라고 생각 할 수 도 있지만.. 많은 노력을 기울였고, 결국 원하는 기능들은 구현한 것 같다. 더 좋은 방법을 고민하고 새로운 것을 찾아가는 건 정말 재밌는 것 같다!