11import logging
22import csv
3+ import time
34
45from django_forest .resources .associations .utils import AssociationView
56from django_forest .resources .utils .csv import CsvMixin
1314
1415class CsvView (SmartFieldMixin , JsonApiSerializerMixin , CsvMixin , AssociationView ):
1516 def get (self , request , pk , association_resource ):
17+ t0 = time .time ()
1618 try :
1719 association_field = get_association_field (self .Model , association_resource )
1820 except Exception as e :
@@ -25,15 +27,25 @@ def get(self, request, pk, association_resource):
2527 queryset = getattr (self .Model .objects .get (pk = pk ), association_resource ).all ()
2628
2729 params = request .GET .dict ()
30+
31+ t2 = time .time ()
2832 # enhance queryset
2933 queryset = self .enhance_queryset (queryset , RelatedModel , params , request , apply_pagination = False )
34+ for _ in queryset [0 :1 ]: # force SQL request execution
35+ pass
3036
37+ t3 = time .time ()
38+ logger .warning (f"-- timing enhance_queryset: { (t3 - t2 ):.2f} seconds" )
3139 # handle smart fields
3240 self .handle_smart_fields (queryset , RelatedModel ._meta .db_table , parse_qs (params ), many = True )
3341
42+ t4 = time .time ()
43+ logger .warning (f"-- timing smart fields: { (t4 - t3 ):.2f} seconds" )
3444 # json api serializer
3545 data = self .serialize (queryset , RelatedModel , params )
3646
47+ t5 = time .time ()
48+ logger .warning (f"-- timing json api serialization: { (t5 - t4 ):.2f} seconds" )
3749 response = self .csv_response (params ['filename' ])
3850
3951 field_names_requested = [x for x in params [f'fields[{ RelatedModel ._meta .db_table } ]' ].split (',' )]
@@ -42,4 +54,7 @@ def get(self, request, pk, association_resource):
4254 writer = csv .DictWriter (response , fieldnames = field_names_requested )
4355 writer .writerow (dict (zip (field_names_requested , csv_header )))
4456 self .fill_csv (data , writer , params )
57+ t6 = time .time ()
58+ logger .warning (f"-- timing csv serialization into response body: { (t6 - t5 ):.2f} seconds" )
59+ logger .warning (f"--- total timing: { (t6 - t0 ):.2f} seconds" )
4560 return response
0 commit comments