DRF의 동작 방식 알기 model, serializer, view, url

DRF를 사용하기 위해서는 DRF의 동작 방식을 알아야 했다.

DRF에서는 model - serializer - view - url 순으로 구현해야 한다.

개인 프로젝트를 진행하면서 작성한 코드로 해당 방식에 대한 동작을 살펴보겠다.

user App 내에서 구현하였다.

 

[model 구현]

 

모델은 데이터이다.

 

class searchLog(models.Model):
    username = models.ForeignKey(Profile,on_delete=models.CASCADE,related_name='searchLogPost',to_field='username_id')
    log = models.CharField(max_length=50,db_column='log')

 

model에서 serchLog라는 class를 구현했다.

해당 모델은 사용자의 검색 기록에 대한 정보를 가지고 있다.

따라서 username 필드에 사용자와 연결되어 있어야 하므로 Foreign Key로 외래키를 설정해 주었다.

log 필드는 검색 내용이 저장된다.

log 기록에 대한 인스턴스를 생성할 수 있는 model을 선언했다. 이제 serializer를 구성해야 한다.

 

[Serializer 구현]

 

serializer의 기능은 직렬화이다.

직렬화란 model의 objec들을 JSON 형식으로 데이터 변환하는 기술이다.

직렬화를 진행해 주어야 변환된 데이터로 저장해서 App과 통신할 수 있다.

 

class searchLogSeralizer(serializers.ModelSerializer):
    class Meta:
        managed=True
        model = searchLog
        fields= ['id','username','log']

 

앞에서 작성한 searchLog에 대한 직렬화 class로 searchLogSeralizer를 작성했다.

이 클래스는 Meta 데이터로 searchLog model을 가지며,

fields에서 앞에 작성한 모델의  필드 중 직렬화할 필드를 정해줄 수 있다.

모든 필드를 직렬화하길 원한다면  fields = "__all__" 로 작성한다.

이제 직렬화(데이터 변환)을 마쳤으니 해당 데이터를 보여주기 위한 class가 필요하다.

 

[view 구현]

 

view의 기능은 변환된 데이터를 보여주는 것이다.

 

#검색 로그 기록
class serachLogViewSet(viewsets.ModelViewSet):
    queryset=  searchLog.objects.all().order_by('-id')
    serializer_class = searchLogSeralizer
    filter_backends = [filters.SearchFilter]

 

검색 기록 view인 searchLogViewSet이다.

이 클래스에서는 앞에 작성한 모델을 직렬화 해주고 url과 연결해서 보여주는 기능을 한다.

queryset 이란 해당 모델에 대한 데이터들의 집합이다. 

order_by 기능을 두었는데, 이는 데이터를 역순으로 정렬해서 최근에 검색한 log가 상단에 나타나도록

코드를 작성한 것이다.

serializer_class 에서 앞에 작성한 searchLogSeralizer 를 적용시켜 준다.

filter_backends 는 데이터 검색 시 필터에 관한 기능이다.

이제 모든 준비를 끝냈으니 view를 url과 연결해주어서 앱에서 접근할 수 있도록 해야한다.

 

[url 구현]

 

router_user = DefaultRouter()
router_user.register('searchLog',serachLogViewSet)

 

url 등록까지 완료했다면 이제 직렬화 과정을 통해서 저장된 데이터를 url을 통해 JSON 형식으로 접근할 수 있다.

해당 url로 접속한다. 

user App 내에서 작성해주었으므로 

GET /user/searchLog로 접속한다.

 

[결과물]

 

 

JSON 형태의 데이터를 확인할 수 있었다.