[DRF Project] 당근마켓 클론#3

Gyubster·2022년 1월 25일
0

당근마켓클론

목록 보기
3/4

모든 코드들을 이야기하는 것보다 효율적으로 작성한 코드 혹은 새롭게 작성한 코드들을 위주로 포스팅을 하는 것이 좋을 것으로 판단하여 그러고자 한다. 전체 코드는 여기에서 확인할 수 있다.

  1. 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
  1. bulk_create() 활용

bulk_create()는 한번에 대량의 레코드를 생성할 때 사용한다. 반복문을 통해서 한번에 하나씩 생성하는 방법보다 코드가 짧아지고 서버에 부하를 안주면서(반복문의 경우, 매 요청마다 insert 요청을 계속하기 때문에..) 데이터를 생성할 수 있다. 관련한 document는 여기에서 확인이 가능하다. 아래는 Document에서의 예시이다.

본 프로젝트에서는 회원가입을 하는 과정에서 생성되는 default 세팅의 즐겨찾기를 만드는데 사용되었다. get_or_created()를 설명하는데 코드가 중간에 나오기때문에 그 부분만 아래에 가져왔다. 모든 코드가 궁금하다면 위의 코드를 참고하면 된다. 회원 가입을 하는 과정에서 bulk_create()를 통해서 유저가 default로 가지게 되는 검색 필터(ex. 전자기기, 의루 등등)을 대량으로 생성하게 하였다. 처음에는 반복문을 통해서 만들었는데, django document를 보는 과정에서 이런 좋은 방법이 있는 것을 확인하였고 잘 작동하는 것을 확인하였다.
 api/user/serializers.py
 
Filter.objects.bulk_create(
            [Filter(user_id = user.id, subcategory_id = id) for id in subcategory_ids]
            )

생각보다 많은 리펙토링을 진행하지는 못했지만 Django는 정말 사용자의 편의를 많이 봐주는 것 같다. 나아중에 다시 이 프로젝트를 보면 정말 아마추어같았구나라고 생각 할 수 도 있지만.. 많은 노력을 기울였고, 결국 원하는 기능들은 구현한 것 같다. 더 좋은 방법을 고민하고 새로운 것을 찾아가는 건 정말 재밌는 것 같다!

profile
공부하는 예비 개발자

0개의 댓글