我的 django Rest Framework 应用程序中有以下模型:
class Question(models.Model):
class Type(models.TextChoices):
TEXT = 'text', 'text question'
RADIO = 'radio', 'choosing one option quesiton'
CHOICE = 'check', 'choosing multiple options question'
type = models.CharField(max_length=5, choices=Type.choices)
title = models.CharField()
description = models.TextField(blank=True, default='')
def __str__(self) -> str:
return f'{self.type}: {self.title}'
class TextQuestion(Question):
answer = models.CharField()
class RadioQuestion(Question):
variants = fields.ArrayField(models.CharField())
answer = models.CharField()
class ChoiceQuestion(Question):
variants = fields.ArrayField(models.CharField())
answers = fields.ArrayField(models.CharField())
class Test(models.Model):
name = models.CharField()
creator = models.ForeignKey(User, on_delete=models.CASCADE)
questions = models.ManyToManyField(Question)```
我想编写序列化器进行测试序列化,但我不知道如何序列化问题字段。因为我对每种问题类型都有不同的序列化器: 我应该怎么办?也许以某种方式重新组织我的模型会更好?
我已经为所有问题类型编写了序列化器:
class TextQuestionSerializer(serializers.ModelSerializer):
class Meta:
model = TextQuestion
fields = '__all__'
class RadioQuestionSerializer(serializers.ModelSerializer):
class Meta:
model = RadioQuestion
fields = '__all__'
class ChoiceQuestionSerializer(serializers.ModelSerializer):
class Meta:
model = ChoiceQuestion
fields = '__all__'
我想过使用
serializer.SerializerMethodField()
但这不适用于 many=True
我遇到了这样的问题,您可以使用serializer.SerializerMethodField()并使用isinstance()编写一个序列化器进行测试。例如:
class TestSerializer(serializers.ModelSerializer):
questions = serializers.SerializerMethodField()
class Meta:
model = Test
fields = ['id', 'name', 'creator', 'questions']
def get_questions(self, obj):
questions = obj.questions.all()
serialized_questions = []
for question in questions:
if isinstance(question, TextQuestion):
serialized_question = TextQuestionSerializer(question).data
#continiue other tasks
serialized_questions.append(serialized_question)
return serialized_questions
您可以检查一下,如果不起作用请告诉我:)