학습주제
사용자와 인증
RelatedField
학습내용
지금까지 사용자와 질문들 사이의 관계를 만들어내고 자신의 질문만 수정할 수 있도록 기능을 만들었다.
이번엔 Question과 유저사이의 관계를 정의하는 필드에 대해 알아본다.
UserSerializer
를 보면
questions
로 serializers.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를 만들어 보았다.