如何从子序列化程序中获取特定字段?

How to get specific fields from child serializers?

比如说,有两个型号:

class Model1(models.Model):
    r = models.CharField(max_length=200)

class Model2(models.Model):
    p = models.CharField(max_length=200)
    m = models.ForeignKey(Model1,on_delete=models.CASCADE)

序列化器是:

class Model1Serializer(serializers.Serializer):
    class Meta:
        model = Model1
        fields = '__all__'

class Model2Serializer(serializers.Serializer):
    class Meta:
         model = Model2
         fields = '__all__'

给定的 Model1 序列化程序 returns 输出为: { "id": 1, "r": "r_value" }

模型 2 序列化器输出为: { "id":1, "p: "p_value", "m": 1 }

问题是我还想要 model2 序列化程序输出中的 r 值。怎么做?

您需要使用正确的 source 指定新字段 - 您可以在 docs.

中阅读更多内容

选项 1:使用 class Serializer:

class Model2Serializer(serializers.Serializer):
    id = serializers.IntegerField()
    p = serializers.CharField()
    r = serializers.CharField(source='m.r')

    class Meta:
         model = Model2
         fields = '__all__'

输出:{'p': u'pppp', 'r': u'rrrrr', 'id': 1}

选项 2:使用 class ModelSerializer:

class Model2Serializer(serializers.ModelSerializer):
    r = serializers.CharField(source='m.r')

    class Meta:
         model = Model2
         fields = '__all__'

输出:{'p': u'pppp', 'r': u'rrrrr', 'm': 1L, u'id': 1}

选项 3:包括整个 Model1:

class Model1Serializer(serializers.ModelSerializer):
    class Meta:
        model = Model1
        fields = '__all__'

class Model2Serializer(serializers.Serializer):
    m = Model1Serializer()

    class Meta:
        model = Model2
        fields = '__all__'

输出:{'m': OrderedDict([(u'id', 1), ('r', u'rrrrr')])}

如果您已经有一个 Model1Serializer 模型 1:

,DRF 会变得很容易
class Model2Serializer(serializers.Serializer):
    m = Model1Serializer()
    class Meta:
         model = Model2
         fields = '__all__'

应该是这样。

1。如果你想要 r 作为 m

的属性

定义特定关系字段的序列化器class


class Model2Serializer(serializers.ModelSerializer):
    m = Model1Serializer()
    class Meta:
        model = Model2
        fields = '__all__'

输出:


[
    {
        "id": 1,
        "m": {
            "id": 1,
            "r": "RED"
        },
        "p": "Light RED"
    },
    {
        "id": 2,
        "m": {
            "id": 1,
            "r": "RED"
        },
        "p": "Dark RED"
    }
]

2。如果你只想 r 使用 ReadOnlyField

您可以使用 ReadOnlyField


class Model2Serializer(serializers.ModelSerializer):
    r = serializers.ReadOnlyField(source='m.r')

    class Meta:
        model = Model2
        fields = '__all__'

输出:

[
    {
        "id": 1,
        "r": "RED",
        "p": "Light RED",
        "m": 1
    },
    {
        "id": 2,
        "r": "RED",
        "p": "Dark RED",
        "m": 1
    }
]

3。如果你只想使用 SerializerMethodField()

你可以将 SerializerMethodField 和 ist 设为只读


class Model2Serializer(serializers.ModelSerializer):
    r = serializers.SerializerMethodField()

    class Meta:
        model = Model2
        fields = '__all__'

    def get_r(self, instance):
        return instance.m.r

输出:

[
    {
        "id": 1,
        "r": "RED",
        "p": "Light RED",
        "m": 1
    },
    {
        "id": 2,
        "r": "RED",
        "p": "Dark RED",
        "m": 1
    }
]

试试这个

class Model1Serializer(serializers.Serializer):
   class Meta:
      model = Model1
      fields = '__all__'

class Model2Serializer(serializers.Serializer):
  r = Model1Serializer(many=True, source="model1_set")
  class Meta:
     model = Model2
     fields = '__all__'

只需在序列化器 Meta 中使用 depth=1。像这样:

class Model2Serializer(serializers.Serializer):
    class Meta:
         model = Model2
         fields = '__all__'
         depth = 1

这将进入该模型中确实存在的外键级别 1。 (顺便说一下,我不推荐大模型。但它非常适合你的情况)