TIL day-63 drf 강의

yo·2020년 9월 16일
0
  1. ModelSerializer는 create, update, validate를 기본적으로 제공한다.
    (그냥 Serialiezr는 없음)

2.serializerMethodField

readonly필드다. serializer에 메서드를 정의해서 리턴값을 사용할 수 있는 필드.
메서드는 get_필드명, 같은 형태로 한다.

3.Serliazers Validation

시리얼라이저에서 커스컴으로 validation할 수 있다.
기본적으로는 def validate메서드를 사용하고(커스텀 가능), 필드별로 validation하고 싶을 땐 추가 메서드를 구현한다. 메서드 이름은 validate_필드이름으로 한다.

4. 1:N (jounalist:Article)/ StringRelatedField

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관계를 바꿀 수도 있다.

  1. API 정석

  2. 1)serializer(data=request.data)
    2)serializer(instance, data=request.data)
    1)의 경우 save()를 하면 create가 호출, 2)의 경우 save()하면 update가 호출된다.

  3. serializer의 또다른 예시. 1:N

8. Mixins

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. GenericView와 Mixin

10. Concrete View Classes

9에서 작성했던 GenericAPIView + List,createMixin의 클래스와 아래 작성한 ConcreateAPIView는 완전히 동일하다. concrete view는 그만큼 간단하고 빠르다.

위 작성한 기능(list, create)에 더해 retrieve, update, destory까지 만들어보자.

urls.py에선 다음과 같이 정의된다.

GenericAPIView의 기본 lookup_field는 아래처럼 pk로 되있다. 이를 바꾸고 싶다면 overriding하면 된다.

11. perform_create override 하기/self.kwargs.get()


정의된 모델은 다음과 같다.

12. CreateModelMixin과정 파헤치기

create메서드는 perform_create를 호출하고 인자로 serializer를 넘겨준다.
self.perform_create(serializer)
perform_create는 serializer.save()를 호출한다.

13. permissions

이해 안가는 코드. IsAdminUserOrReadOnly커스텀 한건데, 이미 있는걸 왜하는건지, 이 코드가 뭘 의미하는건지 잘 모르겠다.

14. from rest_framework.exceptions import ValidationError

15. ebook1개당 한 유저가 하나의 리뷰만 남길 수 있도록 로직 설정하기.


위에 뷰에서 확인할 수있다. 아래는 위 뷰와 연관된 모델과 시리얼라이저.

16. review남긴 유저만이 그 리뷰를 삭제할 수 있게 권한 설정하기.

user 생성 시 signal통해 자동으로 userprofile생성하기

  1. signals.py파일을 아래와 같이 작성한다.

    post_save: signal을 보내는 기능 담당
    receiver: signal을 받는 기능 담당

함수를 @receiver로 꾸며주고 인자로 post_save와 sender를 받는다. 위 예시에서는 User객체 생성 시 시그널을 보내는 것이므로 sender는 User다.

  1. __init__파일에 코드를 추가해줘야 한다.
    `default_app_config = "profiles.apps.ProfilesConfig"

  2. apps.py에 아래와 같이 작성한다.

이까지만 해도 벌써 작동된다.

  1. serializer까지 만들자.

profile
Never stop asking why

0개의 댓글