Hi Salima,

Couple of things you can change in the code to make it run faster!
Do these changes and performance will definitely improve.

1.Queryset

Problem:
classifieds =
vk_classifieds.objects.filter(class_status='1').order_by('-added_date')
This will fetch all the entries in the table; if there are million records
in the table,
all of them will be fetched, which is not required at all!

Processing them will consume resources on the server which is unnecessary
calculation!
Avoid it!

Solution:
classifieds =
vk_classifieds.objects.filter(class_status='1').order_by('-added_date')[:page_size]

Only fetch what you need! As your page size is 40 actual query will look
like below.
classifieds =
vk_classifieds.objects.filter(class_status='1').order_by('-added_date')[:40]

2. Calculation on every request

2.1 classifieds_dist
Distance between two zipcodes is not going to be changed! You dont have to
calculate on every request.
Calculate it only once when the new classified is created and store it in a
separate table.
This calculation must be done using a celery task.

Every time zipcode of classified is updated or user updates his zipcode,
this distance has to be updated.
You have to put restrictions on how many times a user can change his
zipcode.
Otherwise you could end up paying hugh money to the api providers!
This updation must be done using a celery task.


2.2 diff_time
I dont know the code and complexity of it.
However as it is going to be required on every request find a way to
calculate it once and store in a separate table.

Let me know if they are helpful or not!
Cheers!


On Thu, Jan 21, 2021, 9:35 AM Salima Begum <salim...@rohteksolutions.com>
wrote:

> Hi all,
>
> We are building website, Here I have written functionality for classifieds
> page.
> It is loading to slow because of We are prompting distance calculation in
> classifieds page. By using distance API matrix based on logged in user zip
> code and individual Ad zip codes from query set(database).
>
> ```
>     def classifieds(request):
>         global dict_time
>         try:
>             dict_time = {}
>             email = request.session.get('email')
>
>             # Here we are displaying the classified ads "order by date".
> The ads will be sorted by latest date.
>             classifieds =
> vk_classifieds.objects.filter(class_status='1').order_by('-added_date')
>
>             count =
> vk_classifieds.objects.filter(class_status='1').order_by('-added_date').count()
>             for i in classifieds:
>                 # diff_time is a child method. By passing 'i' as object in
> diff_time.
>                 difrnc_date = diff_time(i)
>                 dict_time[i.id] = difrnc_date
>
>             # Pagination for classifieds page.
>             # classified = random.sample(list(classifieds), k=count)
>             # print("classified = ", str(classified))
>             # By default first page
>             page = request.GET.get('page', 1)
>             # print("page = ", str(page))
>             # Per page setting 40 objects.
>             paginator = Paginator(list(classifieds), 40)
>             # print("paginator = ", str(paginator))
>             classified_p = paginator.page(page)
>             # print(classified_p)
>         except PageNotAnInteger:
>             classified_p = paginator.page(1)
>         except EmptyPage:
>             classified_p = paginator.page(paginator.num_pages)
>         except Exception as e:
>             logging.error(e)
>             return render(request, "classifieds.html",
>                           {"Classifieds": classified_p,
>  # distance calculation
>                            "distance": classifieds_dist(email),
>                            'some_date': dict_time,
>                            })
>         return render(request, "classifieds.html", {"Classifieds":
> classified_p,
>                                                     "distance":
> classifieds_dist(email),
>                                                     'some_date': dict_time,
>                                                     })
> ```
>
> ```
>
> def classifieds_dist(email):
>     global frm, km
>     dict_distance = {}
>
>     qury = vk_customer.objects.filter(email=email).first()
>
>     # From above qury variable we are getting zip of customer.
>     frm = qury.Zip
>     # importing json package to calculate the distance
>     url = "
> https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial";
>     headers = {
>         'Authorization': "Bearer somevalue",
>         'User-Agent': "some value",
>         'Accept': "*/*",
>         'Cache-Control': "no-cache",
>         'Postman-Token': "some value",
>         'Host': "maps.googleapis.com",
>         'Accept-Encoding': "gzip, deflate",
>         'Connection': "keep-alive",
>         'cache-control': "no-cache"
>     }
>     classifieds =
> vk_classifieds.objects.filter(class_status='1').order_by('-added_date')
>     for i in classifieds:
>         # while a user login through his login email we capture his
> complete detail into an variable which we given as "qury"
>         # and after the details are stored into the variable from there we
> will filter his starting and destination point as zipcode
>
>         # After login his/her based on email we are filtering in
> vk_customer table. Then storing in qury variable.
>
>         # This zip is getting from vk_classifieds(model in models.py)
> table.
>         # 'i' attribute is getting from classifieds() function.
>         to = i.zip
>
>         origin_list = [to]
>         desination_list = [frm]
>         # here we used api for calculating the source and destination point
>         querystring = {"origins": origin_list, "destinations":
> desination_list, "departure_time": "now",
>                        "key": "AIzaSyDhlCiMAEEfoYhkPcOyP0PLqpHsVMmYEXM"}
>         # here we are passing these headers to the api
>
>         # we are capturing the response in variable called response
>         response = requests.request("GET", url, headers=headers,
> params=querystring)
>         jsondata = response.text
>         obj = json.loads(jsondata)
>         list = obj['rows']
>         if list:
>             a = list[0].get('elements')
>             obj2 = a[0].get("distance")
>             if obj2 is None:
>                 km = "None"
>             else:
>                 km = obj2["text"]
>             dict_distance[i.id] = km
>             l1.append(i.id)
>             print("id = ", str(i.id))
>             print("km = ", str(km))
>     return dict_distance
>
>
> ```
>
> Because of this loading time of classifieds page is to slow. Please help
> me to solve this issue.
>
> Thanks
> ~Salima
>
> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to django-users+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/CAMSz6bn7j5vsyya9%3Dg4wQBQSyiAEkc8%3DSqm_5QOtthUBWnmZFA%40mail.gmail.com
> <https://groups.google.com/d/msgid/django-users/CAMSz6bn7j5vsyya9%3Dg4wQBQSyiAEkc8%3DSqm_5QOtthUBWnmZFA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CAMKMUjvYZLDwu0eVSTupFcJHgOiHXF_FuTw09fhyvhBFXgMTPA%40mail.gmail.com.

Reply via email to