Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest字段分组和自定义_Python_Django_Django Views_Django Rest Framework - Fatal编程技术网

Python Django Rest字段分组和自定义

Python Django Rest字段分组和自定义,python,django,django-views,django-rest-framework,Python,Django,Django Views,Django Rest Framework,我有这样的Django车型: class Floor(models.Model): name = models.CharField(max_lenght =100) class Point(models.Model): created_at = fields.UnixDateTimeField(auto_now_add=True) updated_at = fields.UnixDateTimeField(auto_now=True) flo

我有这样的Django车型:

class Floor(models.Model):
    name = models.CharField(max_lenght =100)

class Point(models.Model):
    created_at      = fields.UnixDateTimeField(auto_now_add=True)
    updated_at      = fields.UnixDateTimeField(auto_now=True)
    floor           = models.ForeignKey(Floor)
    device          = models.CharField(max_lenght=100)
creates_at和updated_at只是带有时间戳的自定义字段

因此,我需要发送请求,比如points/?start=x,end=y,timeslice=z,其中x- 是此期间的开始时间戳、y-结束时间戳、z-时间片。例如,如果x是一天的开始,y是和,z是3600?我将有24个片段,并希望JSON像这样:

{
    floor_id: floor_id
    slice: first timestamp of first slice 
    count: count of devices in this slice
},
{
    floor_id: floor_id
    slice: first timestamp of second slice 
    count: count of devices in this slice
}, 
...
很可能,我需要定制我的序列化程序,使用django过滤器并为此编写特殊视图,但我不知道如何将其组合在一起

UPD:好的,我为地板模型定制了序列化程序,现在它看起来像:

class FloorWithTPCountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Floor
        fields = ('id', 'count')

    count = serializers.SerializerMethodField('get_tp_count')

    def get_tp_count(self, obj):
        return obj.trackpoint_set.values('tag').distinct().count()
不,我收到了JSON,比如:

{
    "id": 28,
    "count": 3
},
{
    "id": 35,
    "count": 1
},

我可以建议,我需要在这个序列化类中获取querystring参数,并声明一个在时间片内计算点的方法。那么,如何在serializer类中获取querydict呢?

好的,正如我早些时候建议的,关键在于序列化程序的定制。我必须声明所需JSON结构的自定义方法。 以下是我的解决方案:

class FloorWithTPCountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Floor
        fields = ('id', 'results')

    results = serializers.SerializerMethodField('get_tp_start')

    def get_tp_start(self, obj):
        query_params = self.context.get("request").query_params
        aggregations = {'hour':3600, 'day':86400, 'week':604800}
        if 'start' in query_params and 'end' in query_params:
            st_tm = int(query_params.get('start'))
            en_tm = int(query_params.get('end'))
            if 'aggregation' in query_params:
                aggregation_value = query_params.get('aggregation')
                aggregation = aggregations.get(aggregation_value)
            else:
                aggregation = en_tm - st_tm
            trackpoint_set = obj.trackpoint_set
            st = [{'count': trackpoint_set.filter(created_at__gte=ts, created_at__lt=ts + aggregation).values(
                'tag').distinct().count(), 'timestamp': ts} for ts in range(st_tm, en_tm, aggregation)]

        else:
            st = None
        return st
当然,它仍然缺少一些querstring一致性检查,但我可以根据需要获取JSON表单。 例如,请求

tpfloors/?start=1496188800&end=1496275199&aggregation=day

我可以得到这样的东西:

  {
    "id": 49,
    "results": [
      {
        "count": 3,
        "timestamp": 1496188800
      }
    ]
  }, 

向你问好。

你的问题不太清楚。请求点/?start=x,end=y,timeslice=z的作用是什么?什么是开始、结束和时间片?哦,很抱歉,我更正了它。只是为了确定,您想获取在开始和结束之间创建的所有点的列表,并在某些时间片中分组在一起,其中时间片是以秒为单位的时间段?不,我想获取每个时间片中开始和结束之间的点的计数。