Python 仅在子级别中显示某个序列化程序字段(新手)

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

我正在慢慢地学习如何使用rest框架,但有一部分我不太懂(我的英语也不太好)。我有一个api点:building,我在api/building/上显示了一些数据,但我希望某个字段只出现在api/building/1(1=pk编号)上,我无法理解这是如何实现的。 以下是到目前为止我的序列化程序代码:

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'
                  )
稍后,在视图集中使用单独的序列化程序(假设您使用的是视图集):


非常感谢你。这解释了很多。我正在阅读上提供的大部分数据,但有时用这样的例子进行解释会有所帮助。非常感谢。这解释了很多。我阅读了上提供的大部分数据,但有时用这样的例子进行解释会有所帮助。