如何通过另一个模型序列化与一个模型相关的字段?

Rah*_*rma 5 django django-rest-framework

我的模型如下:

class Question(models.Model):
    content = models.CharField(
        max_length=1000,
        blank=False,
        default='',
        )

    def __str__(self):
        return self.content


class OptionGroup(models.Model):

    question = models.ForeignKey(
        'Question',
        on_delete=models.CASCADE,
        default='',
        )

    options = models.ManyToManyField('Option')


class Option(models.Model):

    content = models.CharField(
        max_length=1000,
        blank=False,
        default='',
        )
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个 Question 序列化器,它将序列化 Question.content 和所有相关的 Option.content ,而不显示 OptionGroup 中的任何字段。我该怎么做呢?

Rah*_*rma 8

创建一个 SerializerMethod 字段并相应地定义它:

序列化器.py

from rest_framework import serializers

from diagnosisApp.models import Question, Option


class OptionSerializer(serializers.ModelSerializer):

    class Meta:
        model = Option
        fields = ('id', 'content')


class QuestionSerializer(serializers.ModelSerializer):
    options = serializers.SerializerMethodField()

    class Meta:
        model = Question
        fields = ('content', 'options')

    def get_options(self, obj):
        selected_options = Option.objects.filter(
            optiongroup__question=obj).distinct()
        return OptionSerializer(selected_options, many=True).data
Run Code Online (Sandbox Code Playgroud)


Ste*_*evy 6

您可以使用嵌套序列化器来序列化相关模型,如下所示:

class OptionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Option
        fields = ('content',)

class QuestionSerializer(serializers.ModelSerializer):
    options = OptionSerializer(many=True, read_only=True)

    class Meta:
        model = Question
        fields = ('content', 'options')
Run Code Online (Sandbox Code Playgroud)

这将给出以下结果:

{
    'content': 'some content',  # your Question
    'options': [
        {'content': 'some content'},  # related Option
        {'content': 'some other content'},  # related Option
        ...
    ],
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关嵌套序列化器的更多信息。