如何从子序列化程序中获取特定字段?
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。 (顺便说一下,我不推荐大模型。但它非常适合你的情况)
比如说,有两个型号:
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:
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。 (顺便说一下,我不推荐大模型。但它非常适合你的情况)