Python Django Rest字段分组和自定义
我有这样的Django车型: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
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的作用是什么?什么是开始、结束和时间片?哦,很抱歉,我更正了它。只是为了确定,您想获取在开始和结束之间创建的所有点的列表,并在某些时间片中分组在一起,其中时间片是以秒为单位的时间段?不,我想获取每个时间片中开始和结束之间的点的计数。