readonly필드다. serializer에 메서드를 정의해서 리턴값을 사용할 수 있는 필드.
메서드는 get_필드명, 같은 형태로 한다.
시리얼라이저에서 커스컴으로 validation할 수 있다.
기본적으로는 def validate메서드를 사용하고(커스텀 가능), 필드별로 validation하고 싶을 땐 추가 메서드를 구현한다. 메서드 이름은 validate_필드이름
으로 한다.
article에 author는 jounalist를 바라본다. 1:n관계다.
author는 FK라서, article을 출력하면 author의 이름이 아니라 author:1
처럼 숫자가 나온다.
author의 이름을 보여주고 싶다면,방법이 2가지가 있다.
1) serializer에서 author=serializers.StringRelatedField()
로 정의해준다.
이는 __str__
메서드를 활용한 것이다. 정참조, 역참조관계 다 가능하다.
StringRelatedField는 Readonly이고, 인스턴스가 여러개라면 many=True옵션을 주면 된다.
https://www.django-rest-framework.org/api-guide/relations/#stringrelatedfield
2) JournalistSerializer를 만든 뒤, ArticleSerializer에서 이를 사용한다.
author = JournalistSerializer(read_only=True)를 해줄 수도 있다.
상황에 따라 journalist와 article의 nested관계를 바꿀 수도 있다.
API 정석
1)serializer(data=request.data)
2)serializer(instance, data=request.data)
1)의 경우 save()를 하면 create가 호출, 2)의 경우 save()하면 update가 호출된다.
serializer의 또다른 예시. 1:N
Mixin Classes provide action methods such as .list() or .create() rather than defining the handler methods, such as .get() or .post() directly, as we did using the APIView class.
-ListModelMixin은 list 메서드(액션 메서드)를 제공한다.
9에서 작성했던 GenericAPIView + List,createMixin의 클래스와 아래 작성한 ConcreateAPIView는 완전히 동일하다. concrete view는 그만큼 간단하고 빠르다.
위 작성한 기능(list, create)에 더해 retrieve, update, destory까지 만들어보자.
urls.py에선 다음과 같이 정의된다.
GenericAPIView의 기본 lookup_field는 아래처럼 pk로 되있다. 이를 바꾸고 싶다면 overriding하면 된다.
정의된 모델은 다음과 같다.
create메서드는 perform_create를 호출하고 인자로 serializer를 넘겨준다.
self.perform_create(serializer)
perform_create는 serializer.save()를 호출한다.
이해 안가는 코드. IsAdminUserOrReadOnly커스텀 한건데, 이미 있는걸 왜하는건지, 이 코드가 뭘 의미하는건지 잘 모르겠다.
위에 뷰에서 확인할 수있다. 아래는 위 뷰와 연관된 모델과 시리얼라이저.
함수를 @receiver로 꾸며주고 인자로 post_save와 sender를 받는다. 위 예시에서는 User객체 생성 시 시그널을 보내는 것이므로 sender는 User다.
__init__
파일에 코드를 추가해줘야 한다.
`default_app_config = "profiles.apps.ProfilesConfig"
apps.py에 아래와 같이 작성한다.
이까지만 해도 벌써 작동된다.