Django rest frameworkで nested serializer and SerializerMethodFieldが同時に使えません。いったいどのような理由で使えないのか、同時に使うためにはどうすればいいか
ご教授いただければと思います。
models.py
class Quiz(models.Model):
name = models.CharField(max_length=100)
description = models.CharField(max_length=70)
image = models.ImageField(blank=True)
slug = models.SlugField(blank=False)
timestamp = models.DateTimeField(auto_now_add=True)
class Meta: ordering = ['timestamp',] verbose_name_plural = "Quizzes" def __str__(self): return self.name
class Question(models.Model):
quiz = models.ForeignKey(Quiz, related_name='question', on_delete=models.CASCADE)
label = models.CharField(max_length=100)
order = models.IntegerField(default=False)
field = models.CharField(max_length= 50, blank=True)
module = models.CharField(max_length=50, blank=True)
def __str__(self): return self.label
class Answer(models.Model):
question = models.ForeignKey(Question, related_name='answer', on_delete=models.CASCADE)
label = models.CharField(max_length=100)
is_correct = models.BooleanField(default=False)
def __str__(self): return self.label
クイズAPIを作っています。QuizとQuestionとAnswerがForeignKey紐付けされているのでnested serializerを使いjson dataをnestedされた状態で取得するようにします。
serializers.py
class AnswerListSerializer(serializers.ModelSerializer):
class Meta:
model = Answer
fields = ["id", "question", "label", "is_correct"]
class QuestionListSerializer(serializers.ModelSerializer):
answer = AnswerListSerializer(many=True)
class Meta:
model = Question
fields = ["id", "quiz", "label", "order",'field','module',"answers_count","answer"]
class QuizListSerializer(serializers.ModelSerializer):
question = QuestionListSerializer(many=True)
class Meta:
model = Quiz
fields = ["id", "name", "description", "image", "slug" ,"question",]
read_only_fields = ["questions_count"]
これでうまくnestedされたjson dataを取得することができます。しかし、以下のようにSerializerMethodFieldを追加するとエラーが発生します。
エラー
'Question' object has no attribute 'answer_set'
class QuestionListSerializer(serializers.ModelSerializer):
answer = AnswerListSerializer(many=True)
answers_count = serializers.SerializerMethodField()/付け足し部分
class Meta:
model = Question
fields = ["id", "quiz", "label", "order",'field','module',"answers_count"/付け足し部分,"answer"]
def get_answers_count(self, obj):**/付け足し部分** return obj.answer_set.all().count()
逆に、ここからnested serializer部分をコメントアウトし、"answer_count"をfieldsから除外すればSerializerMethodFieldは問題なく動きます。つまり両方同時に使うことはできません。
両方使う方法となぜこうなるのか理由が知りたいです。
よろしくお願いします。
あなたの回答
tips
プレビュー