简体   繁体   English

Django Rest Framework订购Serializer.data

[英]Django Rest Framework Ordering Serializer.data

I have a 3 table and they releated between each other. 我有3张桌子,他们彼此之间相互依le。 Also i have some serializers.SerializerMethodField which is "elapsed_time" this field calculating elapsed_time so how can i order my Entites according to that MethodField. 我也有一些serializers.SerializerMethodField ,它是“ elapsed_time”,该字段计算elapsed_time,所以我如何根据该MethodField排序我的实体。 One way that i found i'm sorting serializer.data this returns OrderedList but this way taking so much time for 2k record. 我发现我对serializer.data排序的一种方法是返回OrderedList,但是这种方法要花大量时间进行2k记录。

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

get_pool_ordered_queryset function takes OrderedDict and sorting. get_pool_ordered_queryset函数接受OrderedDict和排序。

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

Like this but when i add 2k record its taking almost 2 minutes. 像这样,但是当我添加2k时,记录将近2分钟。

I guess your question is how to speed up the process. 我想您的问题是如何加快这一过程。

First of all you don't pass OrderedDict to get_pool_ordered_queryset , you pass list of dict values, that's what serializer.data returns. 首先,您不将OrderedDict传递给get_pool_ordered_queryset ,而是传递dictlist ,这就是serializer.data返回的内容。

Then you spent most of your time, computing 2k times your elapsed_time . 然后,您花费了大部分时间,计算出elapsed_time 2k倍。 You should try to move this part of computation to SQL and sort by it there. 您应该尝试将计算的这一部分移至SQL并在那里进行排序。

You should probably be using annotate of django queryset, and the order by it. 您可能应该使用django queryset的annotate及其order

This would drastically decrease your computation time. 这将大大减少您的计算时间。

The sorted() function may not be the time consumption factor here. 这里的sorted()函数可能不是时间消耗因素。 You said there are 3 related tables. 您说有3个相关表。 Django Queryset's are Lazy , so the 2k items from 3 related tables might consume around 2k x 3 DB connections, which is highly expensive/ time-consuming Django Queryset是Lazy ,因此3个相关表中的2k项可能消耗大约2k x 3个 DB连接,这是非常昂贵的/耗时的

Example : 范例

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'

From this example we can understand, The time consumption is purely because of Django Queryset Lazyness . 从这个例子中我们可以理解,时间的消耗完全是由于Django Queryset Lazyness

In order to speed up your queries, you need some kind of optimization. 为了加快查询速度,您需要进行某种优化。 I would like to suggest reading the optimization techniques that are specified in Django Doc will help you 我建议阅读Django Doc中指定的优化技术可以为您提供帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM