Django Rest Framework订购Serializer.data

时间:2018-07-15 19:48:08

标签: python django django-models django-rest-framework django-views

我有3张桌子,他们之间相互依存。我也有一些serializers.SerializerMethodField,它是“ elapsed_time”这个字段,用于计算elapsed_time,所以我如何根据那个MethodField排序我的实体。我发现要对serializer.data进行排序的一种方法是返回OrderedList,但这种方法要花大量时间进行2k记录。

serializer = self.get_serializer(entites, many=True)
result_page = get_pool_ordered_queryset(serializer.data)

get_pool_ordered_queryset函数接受OrderedDict和排序。

serializer_data = sorted(serializer_data, key=lambda k: k['elapsed_time'], reverse=True)

就像这样,但是当我添加2k时,记录将近2分钟。

2 个答案:

答案 0 :(得分:0)

我想你的问题是如何加快这一过程。

首先,您不将OrderedDict传递给get_pool_ordered_queryset,而是传递list个值中的dict,这就是serializer.data返回的结果。

然后,您花费了大部分时间,计算的时间是elapsed_time的2千倍。您应该尝试将这部分计算移至SQL并在那里进行排序。

您可能应该使用django queryset的annotate,并使用它的order

这将大大减少您的计算时间。

答案 1 :(得分:0)

sorted() 函数可能不是此处的时间消耗因素。您说有3个相关表。 Django Queryset's are Lazy,因此3个相关表中的2k项可能消耗大约 2k x 3 数据库连接,这非常昂贵/耗时

示例

In [1]: def get_time(mylist):
   ...:     pre_time = time.time()
   ...:     sorted(mylist, key=lambda x: x['value'])
   ...:     return "time consumed {}".format(time.time() - pre_time)
   ...: 
   ...: 

In [2]: 
   ...: import time
   ...: from random import randint
   ...: 
   ...: 

In [3]: 
   ...: mylist = []  # creates a list of dict as [ {"value":3},{"value":1},{"value":32},...]
   ...: for i in range(4000):
   ...:     mylist.append({"value": randint(1, 999999)})
   ...:     

In [4]: get_time(mylist)
Out[4]: 'time consumed 0.007257938385009766'

从这个例子中我们可以理解,时间的消耗完全是由于 Django Queryset Lazyness

为了加快查询速度,您需要某种优化。我建议阅读Django Doc中指定的优化技术对您有帮助