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

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

说,有两种型号:

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序列化程序将输出返回为:{“id”:1,“r”:“r_value”}

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

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

django django-rest-framework django-serializer serializer
5个回答
1
投票

您需要使用正确的source指定新字段 - 您可以在docs中阅读更多内容。

Option 1: With 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}

Option 2: With 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}

Option 3: To include whole 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')])}


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__'

0
投票

如果你已经有Model1的Model1Serializer,那么DRF会很容易:

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

那应该是它。


0
投票

如果你想把r作为m的吸引力

定义特定关系字段的Serializer类


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.如果您只想使用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,也可以只读


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
    }
]

0
投票

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

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

这将在该模型中存在的外键中达到1级。 (顺便说一下,我不建议大型号。但它非常适合你的情况)

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