DRF:使用不同的序列化器序列化字段,并且 Many=True

问题描述 投票:0回答:1

我的 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

python django django-rest-framework django-serializer
1个回答
0
投票

我遇到了这样的问题,您可以使用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

您可以检查一下,如果不起作用请告诉我:)

© www.soinside.com 2019 - 2024. All rights reserved.