Python 仅在子级别中显示某个序列化程序字段(新手)
我正在慢慢地学习如何使用rest框架,但有一部分我不太懂(我的英语也不太好)。我有一个api点:building,我在api/building/上显示了一些数据,但我希望某个字段只出现在api/building/1(1=pk编号)上,我无法理解这是如何实现的。 以下是到目前为止我的序列化程序代码:Python 仅在子级别中显示某个序列化程序字段(新手),python,serialization,django-rest-framework,Python,Serialization,Django Rest Framework,我正在慢慢地学习如何使用rest框架,但有一部分我不太懂(我的英语也不太好)。我有一个api点:building,我在api/building/上显示了一些数据,但我希望某个字段只出现在api/building/1(1=pk编号)上,我无法理解这是如何实现的。 以下是到目前为止我的序列化程序代码: class FloorSerializer(serializers.ModelSerializer): class Meta: model = Floor fi
class FloorSerializer(serializers.ModelSerializer):
class Meta:
model = Floor
fields = ('number',
'title')
class BuildingSerializer(serializers.HyperlinkedModelSerializer):
location = serializers.CharField(source='location_address')
avg_temperature = serializers.SerializerMethodField('_get_avg_temperature')
avg_humidity = serializers.SerializerMethodField('_get_avg_humidity')
occupancy_level = serializers.SerializerMethodField('_get_occupancy_level')
floors = FloorSerializer(many=True, read_only=True)
class Meta:
model = Building
fields = ('pk',
'title',
'image_url',
'location',
'campus_name',
'avg_temperature',
'avg_humidity',
'occupancy_level',
'floors')
def _get_avg_temperature(self, obj):
# magia filtrului per buildingu asta.
temp = SensorData.objects.filter(sensor__room__floor__building__pk=obj.pk).filter(sensor__type='TP')\
.aggregate(Avg('value'))
return temp
def _get_avg_humidity(self, obj):
# magia filtrului per buildingu asta.
hum = SensorData.objects.filter(sensor__room__floor__building__pk=obj.pk).filter(sensor__type='HU')\
.aggregate(Avg('value'))
return hum
def _get_occupancy_level(self, obj):
ocup = randint(45, 65)
return ocup
讨论的领域是楼层。我只想在api/building/pk级别上展示它,虽然我阅读了文档,但我并不十分清楚。下面是一个很好的答案,演示了您应该做什么: 总之,您应该创建一个序列化程序,该序列化程序将包含列表路由(/api/building/)中所需的所有方法和字段,然后扩展该序列化程序,在详细信息路由(/api/building/:pk)中添加所需的其他字段 例如:
class BuildingSerializer(serializers.HyperlinkedModelSerializer):
# additional methods for fields that will be
# inherited in the DetailBuildingSerializer
class Meta:
model = Building
fields = ('pk',
'title',
'image_url',
'location',
'campus_name',
'avg_temperature',
'avg_humidity',
'occupancy_level',
)
class DetailBuildingSerializer(BuildingSerializer):
class Meta:
model = Building
fields = ('pk',
'title',
'image_url',
'location',
'campus_name',
'avg_temperature',
'avg_humidity',
'occupancy_level',
'floors'
)
稍后,在视图集中使用单独的序列化程序(假设您使用的是视图集):
下面是一个很好的答案,说明你应该做什么: 总之,您应该创建一个序列化程序,该序列化程序将包含列表路由(/api/building/)中所需的所有方法和字段,然后扩展该序列化程序,在详细信息路由(/api/building/:pk)中添加所需的其他字段 例如:
class BuildingSerializer(serializers.HyperlinkedModelSerializer):
# additional methods for fields that will be
# inherited in the DetailBuildingSerializer
class Meta:
model = Building
fields = ('pk',
'title',
'image_url',
'location',
'campus_name',
'avg_temperature',
'avg_humidity',
'occupancy_level',
)
class DetailBuildingSerializer(BuildingSerializer):
class Meta:
model = Building
fields = ('pk',
'title',
'image_url',
'location',
'campus_name',
'avg_temperature',
'avg_humidity',
'occupancy_level',
'floors'
)
稍后,在视图集中使用单独的序列化程序(假设您使用的是视图集):
非常感谢你。这解释了很多。我正在阅读上提供的大部分数据,但有时用这样的例子进行解释会有所帮助。非常感谢。这解释了很多。我阅读了上提供的大部分数据,但有时用这样的例子进行解释会有所帮助。