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개의 댓글

관련 채용 정보