16. RelatedField

data_hamster·2023년 4월 30일
0

학습주제
사용자와 인증
RelatedField

학습내용
지금까지 사용자와 질문들 사이의 관계를 만들어내고 자신의 질문만 수정할 수 있도록 기능을 만들었다.
이번엔 Question과 유저사이의 관계를 정의하는 필드에 대해 알아본다.

UserSerializer를 보면
questionsserializers.PrimaryKeyRelatedField(many=True, queryset=Question.objects.all())

questions에 보면 해당 questions의 id 목록이 표시된다. questions를 표시할 때 id말고 다른 방법으로 표현하는 방식들이 존재.


.PrimaryKeyRelatedField를 바꾼다.
serializers.StringRelatedField로 바꾼다.
안의 매개변수는 many=True, read_only=True로 한다.

StringRelatedField에선 모델에 정의된 대상 Question 모델에 __str__로 정의된 메소드를 표시하게 된다.(그럼 queryset은?? -> ChatGPT에 물어보니 1:다 외래키 참조의 경우 자동으로 추론함)

다음은 특정필드를 지정할 수 있는 .SlugRelatedField이다. 이는 Question 모델에 아무 필드를 정해서 그 내용을 표시할 수 있도록 한다. pub_date를 지정하도록 한다.
many=True, read_only=True, slug_field='pub_date' 매개변수 설정

다음은 우리가 사용할 HyperlinkedRelatedField를 사용 사실 저 questions가 무엇인지 보고싶을 것이다. 그래서 눌렀을 때 링크를 제공하는 클래스를 사용해본다.
매개변수로 view_name='question-detail을 사용한다.


이 path로 연결한다는 뜻. 해당 question-detail로 이동시켜라. 그럼 pk값도 자동으로 추론해서 넣어주는 것 같다.


이렇게 하이퍼링크가 제공되는 것을 알 수 있다.


question의 상세내용이 나온다.

User List에서 questions를 표시하는 내용은 하나의 정보만 표시했었다. id, String, Slug, 하이퍼링크 등
Question Detail에선 Choice를 표시할 때는 choice_text, choice.votes를 함께 표시해보도록 한다.

초이스의 두가지 필드를 표시하기 위해서 초이스를 위한 시리얼라이저를 만들어준다.

	class ChoiceSerializer(serializers.ModelSerializer):
    	class Meta:
        model = Choice
        fields = ['choice_text', 'votes']

초이스시리얼라이저로 정의한 내용들이 QuestionSerializer 내에서 표현되게 하기 위해서

class QuestionSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    choice_set = ChoiceSerializer(many=True, read_only=True)
    class Meta:
        model = Question
        fields = ['id', 'question_text', 'pub_date','owner','choice_set']

브라우저로 돌아가면

choice_set 필드가 추가되면서 잘 나온다.

choice_set 이름을 choices로 바꾸고자 한다.
우리는 일전에 Question 모델에서 owner가 User을 불러올 때 User가 이 Question을 불러올 때 related_name=questions라 한 것처럼 Choice에서도 가능하다.

class Choice(models.Model):
    question = models.ForeignKey(Question, related_name='choices', on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

다시 QuestionSerializer로 돌아와
choice_set이라고 적지 않아도 choices라고적으면 된다.

요약

Hyperlinked, Slug, StringRelatedField에 대해 알아보았다.
ChoiceSerializer를 만들어서 QuestionSerializer에 넣는 방법으로 Question을 통해 Chocie를 얻는 중첩된 Serializer를 만들어 보았다.

profile
반갑습니다 햄스터 좋아합니다

0개의 댓글