From e9117d881d42a06369d7c7a0d5af534d660e0968 Mon Sep 17 00:00:00 2001 From: 7nimor <7nimor@gmail.com> Date: Tue, 10 Feb 2026 15:46:44 +0330 Subject: [PATCH] update all_product --- app/__pycache__/helper.cpython-39.pyc | Bin 7286 -> 7286 bytes app/__pycache__/models.cpython-39.pyc | Bin 21064 -> 21354 bytes app/__pycache__/serializers.cpython-39.pyc | Bin 22039 -> 21622 bytes app/__pycache__/views.cpython-39.pyc | Bin 124332 -> 124760 bytes ...tstransport_app_allprod_date_e7e7e8_idx.py | 17 ++++ ...app_allprod_date_e7e7e8_idx.cpython-39.pyc | Bin 0 -> 648 bytes ...llproductstransport_indexes.cpython-39.pyc | Bin 0 -> 943 bytes app/models.py | 6 ++ app/serializers.py | 82 +++++------------- app/views.py | 5 +- 10 files changed, 49 insertions(+), 61 deletions(-) create mode 100644 app/migrations/0048_allproductstransport_app_allprod_date_e7e7e8_idx.py create mode 100644 app/migrations/__pycache__/0048_allproductstransport_app_allprod_date_e7e7e8_idx.cpython-39.pyc create mode 100644 app/migrations/__pycache__/0048_allproductstransport_indexes.cpython-39.pyc diff --git a/app/__pycache__/helper.cpython-39.pyc b/app/__pycache__/helper.cpython-39.pyc index 43376aa882a2b46fa082d6ef0c3e30fdbfa2a6c9..e96dcca0dd56a3d0ace8f232c88f78fe962bbafc 100644 GIT binary patch delta 28 icmexn@y&uek(ZZ?0SM+Rc5mbsWn~KX+^obJA`Sp>=mzls delta 28 icmexn@y&uek(ZZ?0SJyUwr}JXWo0VP+^obJA`Sp@-3K%P diff --git a/app/__pycache__/models.cpython-39.pyc b/app/__pycache__/models.cpython-39.pyc index b18875bd3e05fe48aed3058bad6fb9538c3b86c9..66c6394110e67b97dc4861ef773aa03544b561b1 100644 GIT binary patch delta 5703 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 delta 5466 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 fdBY?H!%R@4qF=&@O*RpD#KptsvBCcX9*3aM diff --git a/app/__pycache__/serializers.cpython-39.pyc b/app/__pycache__/serializers.cpython-39.pyc index 98ff34dc11a87f552f75998d76107dcdd4410470..cbc0836d73af23277c039afaa9a3ac62080c5717 100644 GIT binary patch delta 1889 zcmcgteQZ-z6yJUQpxd&oU9Iek&5RL!*%*u|s~g14O#___*}#}(G9GI!uVRa5Rc2C| z{)36e{d4|U1{AqwRCj};Xj+aU(d%q z_nvdl$L$^vzwZ<2N?KY<68(1NzNxNuA4;D#NKGrllCdvufh;0=ukyT0mYP$yfbS*M z+va*g@h31|w;cYguvds4REn(T9kdVZWawq+LnX%=?k;LG77r3H3pm7Lg+Va9$8dmQ zfZ=_HPwKOy|wTt0iN$AhEyF z*KQ;*i4-Ya4?!GVH4iW57h_)OAJ&tkaF7%2`q&CMsp${a--pgc9jW~!hTRO?@M>-$ zCNExSIYn$E+ek#11e}UnILs;7wHS>3Y_MB1c%W>dn-&DdP#!19NF&iINrzS)?A_-T1HdX}Cr zd`&yNgXl!eST$g>qZ6ITeqt2 zO@0`{o=SW4-jCw>%1SYenN@3yAM<9PpjuU69Aokvc2#BP%+48Wjx(IVV^xmZ*|RJg zvYjRAHVz>nb7wi^@L$V1B)hifUA*RfBMjd%e8=!T9(ZJ4=Ql*|H$c=yq9dsub(7*$ zTibk27i{5$69lpa>`bp<-~%H%@NI=V$H41mAIP#x4AIJD3SBu?Y_9IJT_$dDCPoui z=VdLe8!F1NrKU?<(NZ+$(M)kaJMbc3#)ZN0?c=X$jU$`jJnuMj=q0SKt;vbTI!nWB z2zS;l&-{r;~!AvOYcuZt#lm!TJozGEK^j3C7dm(N%du zOmTiNd36C67v^{BoZ>CfuMZ}@qVpR(!XpKQ#~7FC13IV+Nd0pHI**CIWT(_C1%*fo z=%GcE>q)LBxh^J`nv$TK4yIh$=ns}MR1icme4x5jZ|m)83_T=W0{5~mHKuD*{V&4~ zHi=JS*^rR*U8KTuPnH^gBf=-)y7@)Ij#G|%aJ0dK-Sg8B)>t{NXaAqL@QubCJI4_X z!|Zgm`&F;vSAE{ryT*clHdYyLk#VOM2)@wtx)vAQ;_->E*6VFHEoD!&B4qaAo$15afbVc^*c+DPU32|SsATNk)hfC~?}wtx!=wli?Gz)d=N JE*@F;%)hI7{!jn_ delta 2433 zcmd^BeN0>Mr4JBK&fguAO$VX&?W`Z!8i&+S+>)HlhhwXA(H?}<1 z=pWO6BqsNdsel$`y2go+x@2=YVIlKtx}va+&JUQ*iQ7MHj^VfGycSwevgp4ydB2{o zd(XM|oOAD;K1lW-B1x9S#CQ&VC&|;&W@mrWRe^U)0bcCNT;(SrwbSyr-Oo4Zc2L(& z$!WDeWbwo>&L)3gD7%x8PG(tYNa=!k=t~GMBlwsl!w}fN(kkX00p3LD+bFgm5QH}o zdJ*12=tJlatjftI#@CR39pNB?AK@r#%)KY2AIWzR-bHwy9mq9_?;$w={+6=Kxg*9N zV6VXE76CLQo=;NK9u}-!&d#sMVVQX|hEt%Zh9KPPhy^{R==*AJWwtw8b+3Y$zJjoq zU0#;WwE3%(KLd6nj^ULtY@o1$)ud=ydp;Gz_KN8pYgP-V!D2I;ysMh^tocG81a3=o zAPvri5-d1LK4pVRX@+62vCRu;crKtn3oi=gx^~gU*MN2l9inU;AzYbAF?)uAHB@vNF9CNr zx<(CF=cPz`3R&a2cJhOgqPY7~$?X`x6Sx`Y4v*~{ds1l}lZJ+H#;DVAR#CYwBfQoH z8f5!fM`d~HB#@@~*u}9QEAvP{ORowVv0WykK`AYBWiF_?`+FmGlm0+2@rF~Y%!~lT z7O5aq*b&wNm=Y-#6FrY`4B<-zWfjUc9Y^+S1SNF?NR1;z7xpc(kP63|= z{TN#>Q%cy_CXEkH2v@UR#abSQMsf5q{J%Gfu@iOP&e8fg1uA6UD$;83aJvJWyJGd^sO)aZs z)lNd2Jt~LVA)wr*dY1S^o7yIH^S-!lu1$~yx>Xh&8u+v}v6Giovbv0OY9ua9$-FOK zR(X9yR->D4LO7U6M=#jo@PD48peG^XNcT5KqAb!6Wf2^S;7GHWqj`S#M>xN>E|k>b z@>(q($>lU#E!JjxgLd|2Fw^H@D`JlS7lCaMtdeK9nRWmT=^sRk69A!P7nPbMr+IcX zHKJ-QLJ`6cLMKA>KIsBBq;utmN8-fv77&@@VoJIjhx~$uS|vX7cKdF2V?$o~4UoAo zt9d|hM9nAhB1s?`k_oh$sQ*Y1G$i#OWqXR*aD4%L>S4qGHudyp*fdk3HztEiY<9Ot za)xW+U#Br8cJxhBNq-0D4NJfWbJrJ^&H(q^f6F90UH^=Tl|X0k(oLTRvI(ccClI_7 zl$V0$HaZ<>-?)N2+Jlz(QlNPCQ@qqE-sN-{0dHigT*9MB;mt+yXs39TQaqR_o;?%~ T8@dkxPZl~2o|m%pO^^KrP&0rs diff --git a/app/__pycache__/views.cpython-39.pyc b/app/__pycache__/views.cpython-39.pyc index 482277ce1471517daf0164c2b9f46ddc91de543a..45e405990ef03d6cd6983df518f927d4323be9bf 100644 GIT binary patch delta 19734 zcmcJ12Yi&p*8ZN&X0yqr_g-irlz=or5h;p*(qqFCLf!xgX}r6kxnV_=BBFs&hI>T~ zf*>d;Mh$jQuLV(T_X>-O1-oLomV4E!|MQ%8lMM*>e&7B5Kl$yGsb^-+oSAdx%)H+F zQpCYmB4W#8VxnyP-@1ZTmE~i0#f}?o-|SQuJeQ;9kB;?Im93c!SEX&Ey)nXT_eF3l z(umq``<&<4uISO|^0|CWVV=!2@Ymd^X1&ePmVuECUTa?NjVA4iRh7I{f%uw6Kw%S~W z&Fk=n&$KW6m2CKD#9Dcm+G_26ZAP3`zlqFrb>(>({(eFuA;ZR{5{KH1r1ty^BqvF7 zk~t@(J*VDC^@YzPrcp0tQlw1kP#a>*rnHUJ80Cv##nEh&&{(DyEKe!O*Hq{ zwpOGA{^R>*^*?hKCOyu`435}tmdMEBjm(YQcyN?iQYzlaYA>}YSSkypjGzE87uE*T zT}byP2uCn;*%>y!krQN00*^2k1r45zO2R082~A;U7pZ*Wh!WaIWS_g=mr#|+(q-eO ze&n$xlqQO_iez#uDI~ibOZFvLT$aCnW_Rt4!9KZ-Jnl@2k-w3eQ+ciueTm$G3w()H zX+}XB%a2jenB)@)F**&kMiM0x$laDHOyI7hdo!vsjm}1w)s)6VD9!qJo$<3cgqaTn zdmZfAY@5+_6RouQ;+q`iD?F#k{7do0^PEm;OkHl9Nk%uL@LHEI)tc$0)R^W=YmPU% z8<@CsUpm$r*Nye1`_hae7R;39Y+t%eUNS|QjrB~2;bG}cc#~0TWZtnEO@sQta z%<+2*q+>ZoU*1Pf3rb9`FP95-^5y(N-gDcfBYdvSmut;;ZK6=ICM-v$E7#je=;l^+ z<{|f6ZI>mQ$KB24f#fmuYkhfDU3~uB(k>k6%E?_JY*pPjRyZe&3;2xwoZ7vu5npaq zdUMf6ZnP@T3Z>hsdO&)(RL{0j%#(xGkc=L_1Y-d6I?fkY+8!;v!&axNArH% z<@i(<;V2f#(|E0�@j)>&15pM$5<${}s3{fob*8suVSPm)W_+C$ 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'D)vdLsvj`;oB=AeNy=?X6DY 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 H8vOqNuW_^I delta 19382 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 RrsqQ|V*UK4HTM%5_&<&ND_8&k diff --git a/app/migrations/0048_allproductstransport_app_allprod_date_e7e7e8_idx.py b/app/migrations/0048_allproductstransport_app_allprod_date_e7e7e8_idx.py new file mode 100644 index 0000000..7d0fd69 --- /dev/null +++ b/app/migrations/0048_allproductstransport_app_allprod_date_e7e7e8_idx.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.19 on 2026-02-10 12:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0047_hatching_loadingsum'), + ] + + operations = [ + migrations.AddIndex( + model_name='allproductstransport', + index=models.Index(fields=['date', 'id'], name='app_allprod_date_e7e7e8_idx'), + ), + ] diff --git a/app/migrations/__pycache__/0048_allproductstransport_app_allprod_date_e7e7e8_idx.cpython-39.pyc b/app/migrations/__pycache__/0048_allproductstransport_app_allprod_date_e7e7e8_idx.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..beae93afb6ac0e8f2ea7b2cead8135cdfffbd7a0 GIT binary patch literal 648 zcmaKqPixgc5Wx3OlIA_E6zo9|ufn^OcMw`cq@o}_^daqS2@LC-HE$ouChq1zd$zaI z52D}0FR@ooegzNK*|eqg;)I>d?99&WZxX$|J!K?6o?qJUoUxzDc_3Ea986fLo&R+Bh6zUx5^rS5z6bUuH%4=X(^ zSJu_gbQ(HDn=t3ooI{f6N-%L_v-zt>Ui<-9k>px8;o~ms7`dyc&(La5zE&%Q+bm>LxSIte*p+OwYdNQ literal 0 HcmV?d00001 diff --git a/app/migrations/__pycache__/0048_allproductstransport_indexes.cpython-39.pyc b/app/migrations/__pycache__/0048_allproductstransport_indexes.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..049c9387ced07a7be0467943904b7cebcd4e3968 GIT binary patch literal 943 zcmah|F^|(Q6n31XO-l;}j?+mnBXzjy1|$$d=nzQghO5vWQ&eG@Jd-*~oM5Nu?pD~) z?KiXWm%K7Du`>YAZcpt{2}^!{?|skj<$KTJ!(pG`y4w9J-$jJ{aK`3BA34Nr9-;sO zK}o704Jw+_fV?I^A^buh6hRSw4$}~#Q!^akv<|fwju*WhFg)F zh}^nH@;FUkgp_XE-tjdTBo^|fN%sy89zAAr-ez;Da#q$H@HC4m-Qi`~=o%JTYg)~f zX=>e$LmQ)E<`?lk@K#(5_A@O|Va~F9ylI)oz0ES`WfIP?T<3!nB^VniUJ2h<*GuLs z8%qV^On0z*w!127@2!)qTrQK{0byFH{6rW6pQOr!-CYMe-1&XbsWx*K zOP7zjvx?eCZSSr#7S8Vir{kVYnEz(RY@acF4~tTuK49$Qf|rhsvp_TgDXB~fqp72n zyZ|`zEJJ6;Ubp?a5v#}bo#^|Bc=7w~tEaQ$>6@2K)l8~ZXeHX&2{#8DW zZ2dB4IL0Sz+r;oXwpN%)bFSTg;I^5dNJ9EIilcxAqd!sfpYxZ$I~_;12L)GoJ%RV0 bmv(GCxc>U3_5cB!JX?0?dEm;rMvTILmb4Qb literal 0 HcmV?d00001 diff --git a/app/models.py b/app/models.py index 9ba98d2..7d9caff 100644 --- a/app/models.py +++ b/app/models.py @@ -1,4 +1,5 @@ import datetime +from operator import index import re from datetime import timedelta from itertools import product @@ -671,6 +672,11 @@ class AllProductsTransport(BaseModel): # بارهای تمامی محصولات unloading = models.CharField(max_length=255, null=True, blank=True) # تخلیه out = models.BooleanField(default=False) # Out (True/False) + class Meta: + indexes = [ + models.Index(fields=['trash', '-date', '-id'], name='apt_trash_date_id_idx'), + ] + def save(self, *args, **kwargs): # تصحیح استان/شهر مبدا if self.origin_province: diff --git a/app/serializers.py b/app/serializers.py index 062e2f0..59d78e6 100644 --- a/app/serializers.py +++ b/app/serializers.py @@ -622,66 +622,32 @@ class AllProductsTransportCustomSerializer(serializers.ModelSerializer): def get_location_origin(self, obj): resul = {} - # بهینه‌سازی: استفاده از context cache برای جلوگیری از N+1 queries - location_cache = self.context.get('location_cache', {}) - - if obj.origin_province: - cache_key = f"province_{obj.origin_province}" - if cache_key not in location_cache: - province_origin = Province.objects.filter(name=obj.origin_province).only('Lat', 'Lng').first() - if province_origin: - location_cache[cache_key] = { - "provinceLat": province_origin.Lat, - "provinceLng": province_origin.Lng - } - else: - location_cache[cache_key] = {} - resul.update(location_cache.get(cache_key, {})) - - if obj.origin_city: - cache_key = f"city_{obj.origin_city}" - if cache_key not in location_cache: - city_origin = City.objects.filter(name=obj.origin_city).only('Lat', 'Lng').first() - if city_origin: - location_cache[cache_key] = { - "cityLat": city_origin.Lat, - "cityLng": city_origin.Lng - } - else: - location_cache[cache_key] = {} - resul.update(location_cache.get(cache_key, {})) - + province_origin = Province.objects.filter(name=obj.origin_province).first() + city_origin = City.objects.filter(name=obj.origin_city).first() + if province_origin: + resul.update({ + "provinceLat": province_origin.Lat, + "provinceLng": province_origin.Lng + }) + if city_origin: + resul.update({ + "cityLat": city_origin.Lat, + "cityLng": city_origin.Lng + }) return resul def get_location_destination(self, obj): resul = {} - # بهینه‌سازی: استفاده از context cache برای جلوگیری از N+1 queries - location_cache = self.context.get('location_cache', {}) - - if obj.destination_province: - cache_key = f"province_{obj.destination_province}" - if cache_key not in location_cache: - province_destination = Province.objects.filter(name=obj.destination_province).only('Lat', 'Lng').first() - if province_destination: - location_cache[cache_key] = { - "provinceLat": province_destination.Lat, - "provinceLng": province_destination.Lng - } - else: - location_cache[cache_key] = {} - resul.update(location_cache.get(cache_key, {})) - - if obj.destination_city: - cache_key = f"city_{obj.destination_city}" - if cache_key not in location_cache: - city_destination = City.objects.filter(name=obj.destination_city).only('Lat', 'Lng').first() - if city_destination: - location_cache[cache_key] = { - "cityLat": city_destination.Lat, - "cityLng": city_destination.Lng - } - else: - location_cache[cache_key] = {} - resul.update(location_cache.get(cache_key, {})) - + province_destination = Province.objects.filter(name=obj.destination_province).first() + city_destination = City.objects.filter(name=obj.destination_city).first() + if province_destination: + resul.update({ + "provinceLat": province_destination.Lat, + "provinceLng": province_destination.Lng + }) + if city_destination: + resul.update({ + "cityLat": city_destination.Lat, + "cityLng": city_destination.Lng + }) return resul diff --git a/app/views.py b/app/views.py index 8df65a0..5b27782 100644 --- a/app/views.py +++ b/app/views.py @@ -4629,15 +4629,14 @@ class AllProductsTransportViewSet(viewsets.ModelViewSet): # بهینه‌سازی: استفاده از select_related برای جلوگیری از N+1 queries # و اعمال order_by فقط یک بار - transports = AllProductsTransport.objects.select_related('hatching').filter(**filters) + transports = AllProductsTransport.objects.filter(**filters) if search and search != 'undefined' and search.strip(): transports = transports.filter( build_query(self.filterset_class.Meta.fields, search) ) - # اعمال order_by فقط یک بار در آخر - transports = transports.order_by('-date', '-create_date') + transports = transports.order_by('-date', '-id') page_size = request.query_params.get('page_size', None) if page_size: