рдПрдХ рднреА рдУрдЖрд░рдПрдо рдирд╣реАрдВ

рдПрдХ рднреА рдУрдЖрд░рдПрдо рдирд╣реАрдВ


рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореИрдВ Ostrovok.ru рд╣реЛрдЯрд▓ рдЖрд░рдХреНрд╖рдг рд╕реЗрд╡рд╛ рдХреЗ рднрд╛рдЧреАрджрд╛рд░ рд╡рд┐рдХрд╛рд╕ рд╡рд┐рднрд╛рдЧ рдХрд╛ рдкреНрд░рднрд╛рд░реА рд╣реВрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рд╣рдордиреЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ Django ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдзреЛрдЦрд╛ рджреЗ рд░рд╣рд╛ рдерд╛, рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ " рдирд╣реАрдВ ORM рдПрдХрд▓ "ред рдпрджрд┐ рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣ рдХреНрдпреЛрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде:


  • рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдЯреИрдХ рдкрд░ Django рд╣реИ, рдФрд░ рдЖрдк ORM рд╕реЗ рдЕрдзрд┐рдХрддрдо Model.objects.all() , рди рдХрд┐ рдХреЗрд╡рд▓ Model.objects.all() ,
  • рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрддрд░ рдкрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ,
  • рдпрд╛ рдХреНрдпрд╛ рдЖрдк рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ B2B.Ostrovok.ru рдкрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдмрд╣рд╛рдирд╛ "рдЗрддрдирд╛ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ" рдХреНрдпреЛрдВ рд╣реИ ,

... рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред


kdpv


2014 рдореЗрдВ, рд╣рдордиреЗ B2B.Ostrovok.ru рд╢реБрд░реВ рдХрд┐рдпрд╛ - рдкрд░реНрдпрдЯрди рдмрд╛рдЬрд╛рд░ рдореЗрдВ рдкреЗрд╢реЗрд╡рд░реЛрдВ (рдЯреНрд░реИрд╡рд▓ рдПрдЬреЗрдВрдЯреЛрдВ, рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдЧреНрд░рд╛рд╣рдХреЛрдВ) рдХреЗ рд▓рд┐рдП рд╣реЛрдЯрд▓, рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг, рдХрд╛рд░реЛрдВ рдФрд░ рдЕрдиреНрдп рдпрд╛рддреНрд░рд╛ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдирд▓рд╛рдЗрди рдмреБрдХрд┐рдВрдЧ рд╕реЗрд╡рд╛ред


B2B рдореЗрдВ, рд╣рдордиреЗ GenericForeignKey - рдореЗрдЯрд╛ рдСрд░реНрдбрд░ - MetaOrder рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЕрдореВрд░реНрдд рдСрд░реНрдбрд░ рдореЙрдбрд▓ рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдФрд░ рдХрд╛рдлреА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред


рдПрдХ рдореЗрдЯрд╛ рдСрд░реНрдбрд░ рдПрдХ рдЕрдореВрд░реНрдд рдЗрдХрд╛рдИ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрджреЗрд╢ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╣реЛрдЯрд▓ ( Hotel ), рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрд╡рд╛ ( Upsell ) рдпрд╛ рдХрд╛рд░ ( Car )ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдореЗрд╢рд╛ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИред рдЬрдм рдмреА 2 рдмреА рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХреА рдЧрдИ рдереА, рддреЛ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЗрд╡рд▓ рд╣реЛрдЯрд▓ рдмреБрдХ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рдереЗ, рдФрд░ рд╕рднреА рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рддрд░реНрдХ рдЙрди рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рдереЗред рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд┐рдХреНрд░реА рд░рд╛рд╢рд┐ рдФрд░ рдЖрд░рдХреНрд╖рдг рд╡рд╛рдкрд╕реА рд░рд╛рд╢рд┐ рдХреА рд╡рд┐рдирд┐рдордп рджрд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рдордп рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдореЗрдЯрд╛-рдСрд░реНрдбрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкреВрд░реЗ рдХреЛрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрд╛ рдФрд░ рдЗрд╕ рдзрд░реЛрд╣рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирдИ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдЖ рдЧрдпрд╛ред рджрд░рдЕрд╕рд▓, рдЗрд╕рд╕реЗ рдЧрдгрдирд╛ рдореЗрдВ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬреЛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдХрд░реЗрдВ - рддреЛ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ ...


рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ Django ORM рдХреА рд╢рдХреНрддрд┐ рджрд┐рдЦрд╛рдирд╛ рд╣реИред


рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕


рдЕрдкрдиреЗ рдЦрд░реНрдЪреЛрдВ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдмреА 2 рдмреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдереА рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдм / рдХрд▓ / рдмрд╛рдж рдореЗрдВ рдХрд┐рддрдирд╛ рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпрд╛ рдЙрдирдХреЗ рдкрд╛рд╕ рдСрд░реНрдбрд░ рдкрд░ рдХрд░реНрдЬ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╡реЗ рдЕрдкрдиреА рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рдХрд┐рддрдирд╛ рдЦрд░реНрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рдбреИрд╢рдмреЛрд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЖрд░реЗрдЦ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реЙрдХреЗрдЯред


dash1
(рд╕рднреА рдорд╛рди рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рдЧреАрджрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ)


рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рд╣рдо рд╕рд╛рдереА рдХреЗ рд╕рднреА рдЖрджреЗрд╢реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред


рд╕рдорд╛рдзрд╛рди рдХреЗ рд╡рд┐рдХрд▓реНрдк


рд╣рдо рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рд╣рдо рдПрдХ рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдп рдХрдВрдкрдиреА рд╣реИрдВ, рд╡рд┐рднрд┐рдиреНрди рджреЗрд╢реЛрдВ рдХреЗ рд╣рдорд╛рд░реЗ рд╕рд╛рдЭреЗрджрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореБрджреНрд░рд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рдЪрд╛рд▓рди - рдЦрд░реАрдж рдФрд░ рдлрд┐рд░ рд╕реЗ рдмреЗрдЪрдирд╛ рдЖрд░рдХреНрд╖рдг рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдЪреБрдиреА рд╣реБрдИ рдореБрджреНрд░рд╛ (рдЖрдорддреМрд░ рдкрд░ рд╕реНрдерд╛рдиреАрдп) рдореЗрдВ рд╡рд┐рддреНрддреАрдп рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рдпрд╣ рд╕рднреА рдореБрджреНрд░рд╛рдУрдВ рдХреА рджрд░реЛрдВ рдкрд░ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдФрд░ рдЕрд╡реНрдпрд╡рд╣рд╛рд░рд┐рдХ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рд╕рдВрджрд░реНрдн рдореБрджреНрд░рд╛ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реВрдмрд▓ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рд╕рднреА рдореБрджреНрд░рд╛рдУрдВ рдХреА рджрд░реЛрдВ рдХреЛ рдХреЗрд╡рд▓ рд░реВрдмрд▓ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рдЬрдм рдПрдХ рд╕рд╛рдереА рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдмрд┐рдХреНрд░реА рдХреЗ рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рджрд░ рдкрд░ рдорд╛рддреНрд░рд╛рдУрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред


"рдорд╛рдереЗ рдореЗрдВ"


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ Model.objects.all() рдФрд░ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд▓реВрдк рд╣реИрдВ:


рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде Model.objects.all ()
 def output(partner_id): today = dt.date.today() # query_get_one -    partner = query_get_one(Partner.objects.filter(id=partner_id)) #    -  query = MetaOrder.objects.filter(partner=partner) result = defaultdict(Decimal) for morder in query: #  ,     #     payment_pending = morder.get_payment_pending() payment_due = morder.get_payment_due() #        # (     ) payable = morder.get_payable_in_cur() #       if payment_pending > today: result['payment_pending'] += payable # ,     if payment_pending < today and payment_due > today: result['payment_due'] += payable return result 

рдпрд╣ рдХреНрд╡реЗрд░реА рдПрдХ рдЬрдирд░реЗрдЯрд░ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рд╕реМ рдмреБрдХрд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмреБрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЪрдХреНрд░ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред


рдЖрдк prefetch_related рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рддреЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 # object -      GenericForeignKey. query = query.prefetch_related('object') 

рддрдм рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реЗ рдХрдо рдЕрдиреБрд░реЛрдз рд╣реЛрдВрдЧреЗ ( GenericForeignKey рдкрд░ GenericForeignKey ), рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд░реЛрдХ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЪрдХреНрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдЕрднреА рднреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


output рд╡рд┐рдзрд┐ (рдФрд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП) рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдкрд╣рд▓реА рдХреЙрд▓ рдПрдХ рдорд┐рдирдЯ рдХреЗ рдЖрджреЗрд╢ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИ, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред


рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:


timing_before


рдФрд╕рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп 4 рд╕реЗрдХрдВрдб рд╣реИ, рдФрд░ 21 рд╕реЗрдХрдВрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓реА рдЪреЛрдЯрд┐рдпрд╛рдВ рд╣реИрдВред рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд╣реИред


рд╣рдордиреЗ рд╕рднреА рднрд╛рдЧреАрджрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдбреИрд╢рдмреЛрд░реНрдб рдХреЛ рд░реЛрд▓ рдЖрдЙрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд┐рдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрдирд╛ рдЕрднреА рднреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИред


count_before
рдиреАрдЪреЗ рджрд╛рдИрдВ рдУрд░ рдХреА рд╕рдВрдЦреНрдпрд╛рдПрдБ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИрдВ: рдиреНрдпреВрдирддрдо, рдЕрдзрд┐рдХрддрдо, рдФрд╕рдд, рдХреБрд▓ред


рдорди рдХреЗ рд╕рд╛рде


рдорд╛рдереЗ рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛рд░реНрдп рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рдерд╛ред рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрдИ рд╕рд░рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдИ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рддреЗрдЬрд╝ рдФрд░ рдХрдо рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рд╣реЛрдЧрд╛ред


рдЕрдиреБрд░реЛрдз рдпреЛрдЬрдирд╛


рдХреНрд╡реЗрд░реА рдкреНрд▓рд╛рди рдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╕реНрдЯреНрд░реЛрдХ рдЗрд╕ рддрд░рд╣ рд╡рд░реНрдгрд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:


  • рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрджреЗрд╢ рдПрдХрддреНрд░ рдХрд░реЗрдВ,
  • annotate рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рддреИрдпрд╛рд░ рдХрд░реЗрдВ,
  • рдлрд╝реАрд▓реНрдб рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ
  • рд░рд╛рд╢рд┐ рдФрд░ рдорд╛рддреНрд░рд╛ рдХреЗ aggregate рд╕реЗ aggregate рдмрдирд╛рдПрдВ

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢рд░реНрддреЗрдВ


рд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╛рдереА рдЕрдкрдиреЗ рдЕрдиреБрдмрдВрдз рдкрд░ рдХреЗрд╡рд▓ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


 partner = query_get_one(Partner.objects.filter(id=partner_id)) 

рдпрджрд┐ рд╣рдо рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрд░реНрдбрд░ / рдмреБрдХрд┐рдВрдЧ рджрд┐рдЦрд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдорд░реНрдерд┐рдд рд▓реЛрдЧреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


 query = MetaOrder.objects.filter( partner=partner, content_type__in=[ Hotel.get_content_type(), Car.get_content_type(), Upsell.get_content_type(), ] ) 

рдЖрджреЗрд╢ рдХреА рд╕реНрдерд┐рддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ( Q рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ):


 query = query.filter( Q(hotel__status__in=['completed', 'cancelled']) #     ,    # | Q(car__status__in=[...]) ) 

рд╣рдо рдЕрдХреНрд╕рд░ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрди рд╕рднреА рдЖрджреЗрд╢реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпреЗ рд╕рд┐рд░реНрдл рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд┐рд▓реНрдЯрд░ рд╣реИрдВред рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдПрдХ рддреИрдпрд╛рд░ рдХреНрд╡реЗрд░реА рд▓реМрдЯрд╛рддреА рд╣реИ, рд╡рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:


 query = MetaOrder.exclude_non_payable_metaorders(query) 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдПрдХ QuerySet рднреА QuerySet ред


рд╣рдо рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪрд░ рднреА рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ:


 import datetime as dt from typing.decimal import Decimal today = dt.date.today() result = defaultdict(Decimal) 

рдлреАрд▓реНрдб рддреИрдпрд╛рд░реА ( annotate )


рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╣рдореЗрдВ рдСрд░реНрдбрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЦреЗрддреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рд╣реИ, рд╣рдо Coalesce рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирдП рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╕рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдпрд╣рд╛рдБ annotate рдмреНрд▓реЙрдХ рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╣реИ:


рдкрд╣рд▓реЗ рдПрдиреЛрдЯреЗрдЯ
 #     , #      from app.helpers.numbers import ZERO, ONE query_annoted = query.annotate( _payment_pending=Coalesce( 'hotel__payment_pending', 'car__payment_pending', 'upsell__payment_pending', ), _payment_due=Coalesce( 'hotel__payment_due', 'car__payment_due', 'upsell__payment_due', ), _refund=Coalesce( 'hotel__refund', Value(ZERO) ), _refund_currency_rate=Coalesce( 'hotel__refund_currency_rate', Value(ONE) ), _sell=Coalesce( 'hotel__sell', Value(ZERO) ), _sell_currency_rate=Coalesce( 'hotel__sell_currency_rate', Value(ONE) ), ) 

Coalesce рдпрд╣рд╛рдВ рдзрдорд╛рдХреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣реЛрдЯрд▓ рдХреЗ рдСрд░реНрдбрд░ рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖ рдЧреБрдг рд╣реИрдВ, рдФрд░ рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдХрд╛рд░реЛрдВ) рдпреЗ рдЧреБрдг рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рд╣реИ рдХрд┐ рд░рд╛рд╢рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП Value(ZERO) рдФрд░ рд╡рд┐рдирд┐рдордп рджрд░реЛрдВ рдХреЗ рд▓рд┐рдП Value(ONE) рдкреНрд░рдХрдЯ рд╣реЛрддреЗ рд╣реИрдВред ZERO рдФрд░ ONE рдХреЗрд╡рд▓ Decimal('0') рдФрд░ Decimal(1) , рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВред рдПрдХ рд╢реМрдХрд┐рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЖрдкрдХреЗ рдорди рдореЗрдВ рд╕рд╡рд╛рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореЗрдЯрд╛ рдСрд░реНрдбрд░ рдореЗрдВ рдХреБрдЫ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдПрдХ рд╕реНрддрд░ рддрдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рдП? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, payment_pending , рдЬреЛ рд╣рд░ рдЬрдЧрд╣ рд╣реИред рджрд░рдЕрд╕рд▓, рд╕рдордп рдХреЗ рд╕рд╛рде, рд╣рдо рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдореЗрдЯрд╛-рдСрд░реНрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рдХреЛрдб рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣рдорд╛рд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рд╣реИрдВред


рдПрдХ рдФрд░ рддреИрдпрд╛рд░реА рдФрд░ рдЧрдгрдирд╛


рдЕрдм рд╣рдореЗрдВ рдЙрди рд░рд╛рд╢рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧрдгрдирд╛рдПрдБ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдкрд┐рдЫрд▓реЗ annotate рдмреНрд▓реЙрдХ рдореЗрдВ рдорд┐рд▓реА рдереАрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдм рдЖрдкрдХреЛ рдЖрджреЗрд╢ рдХреЗ рдкреНрд░рдХрд╛рд░ (рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдЫреЛрдбрд╝рдХрд░) рд╕реЗ рдмрдВрдзреЗ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рджреВрд╕рд░рд╛ рдПрдиреЛрдЯреЗрдЯ
 .annotate( #  _base     _sell_base=( F('_sell') * F('_sell_currency_rate') ), _refund_base=( F('_refund') * F('_refund_currency_rate') ), _payable_base=( F('_sell_base') - F('_refund_base') ), _reporting_currency_rate=Case( When( content_type=Hotel.get_content_type(), then=RawSQL( '(hotel.currency_data->>%s)::numeric', (partner.reporting_currency,), ), ), output_field=DecimalField(), default=Decimal('1'), ), ) 

рдЗрд╕ рдмреНрд▓реЙрдХ рдХрд╛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ _reporting_currency_rate рдлрд╝реАрд▓реНрдб рдпрд╛ рдмрд┐рдХреНрд░реА рдХреЗ рд╕рдордп рд╕рдВрджрд░реНрдн рдореБрджреНрд░рд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд┐рдордп рджрд░ рд╣реИред рдПрдХ рд╣реЛрдЯрд▓ рдХреЗ рдСрд░реНрдбрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рдореБрджреНрд░рд╛рдУрдВ рдХреА рд╡рд┐рдирд┐рдордп рджрд░реЛрдВ рдкрд░ рдбреЗрдЯрд╛ рдореБрджреНрд░рд╛ рдореБрджреНрд░рд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл JSON рд╣реИред рд╣рдо рдРрд╕рд╛ рдХреНрдпреЛрдВ рд░рдЦрддреЗ рд╣реИрдВ? рдпрд╣ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдорд╛рдорд▓рд╛ рд╣реИ ред


рдФрд░ рдпрд╣рд╛рдБ, рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВ рдирд╣реАрдВ F рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЕрдиреБрдмрдВрдз рдореБрджреНрд░рд╛ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ? рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:


 F(f'currency_data__{partner.reporting_currency}') 

рд▓реЗрдХрд┐рди f-strings рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ F рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рддрдереНрдп рдХрд┐ Django ORM рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдиреЗрд╕реНрдЯреЗрдб json рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдмрд╣реБрдд рд╣реА рдордирднрд╛рд╡рди рд╣реИ - F('currency_data__USD') ред


рдФрд░ рдЕрдВрддрд┐рдо annotate рдмреНрд▓реЙрдХ _payable_in_cur рдЧрдгрдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рднреА рдЖрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП _payable_in_cur рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдореВрд▓реНрдп рдЕрдиреБрдмрдВрдз рдореБрджреНрд░рд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


dash2


 .annotate( _payable_in_cur=( F('_payable_base') / F('_reporting_currency_rate') ) ) 

annotate рд╡рд┐рдзрд┐ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд SELECT something AS something_else рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ SELECT something AS something_else рдХрд┐ SELECT something AS something_else рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕реЗ SQL рдХреНрд╡реЗрд░реА - query.__str__() рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рдХреЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдпрд╣ рд╡рд╣ рдЖрдзрд╛рд░ рд╣реИ рдЬреЛ Django ORM рджреНрд╡рд╛рд░рд╛ base_query_annotated рд▓рд┐рдП рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ SQL рдХреЛрдб base_query_annotated ред рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╛рд░ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреА рдХреНрд╡реЗрд░реА рдХреЛ рдХрд╣рд╛рдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдВрддрд┐рдо рдЧрдгрдирд╛


aggregate рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдЖрд╡рд░рдг рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдпрджрд┐ рд╕рд╛рдереА рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореАрдЯреНрд░рд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗред


dash3


 def _get_data_from_query(query: QuerySet) -> Decimal: result = query.aggregate( _sum_payable=Sum(F('_payable_in_cur')), ) return result['_sum_payable'] or ZERO 

рдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд - рдпрд╣ рд╡реНрдпрд╡рд╕рд╛рдп рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЕрдВрддрд┐рдо рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрди рд╕рднреА рдЖрджреЗрд╢реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЬрд▓реНрдж рд╣реА рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред


dash4


 before_payment_pending_query = _get_data_from_query( base_query_annotated.filter(_payment_pending__gt=today) ) 

рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рд╕рддреНрдпрд╛рдкрди


рдмрдирд╛рдП рдЧрдП рдЕрдиреБрд░реЛрдз рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЧрдгрдирд╛ рдХреЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред


 for morder in query: payable = morder.get_payable_in_cur() payment_pending = morder.get_payment_pending() if payment_pending > today: result['payment_pending'] += payable 

рдХреНрдпрд╛ рдЖрдк "рдорд╛рдереЗ" рд╡рд┐рдзрд┐ рдЬрд╛рдирддреЗ рд╣реИрдВ?


рдЕрдВрддрд┐рдо рдХреЛрдб


рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕рд╛ рдХреБрдЫ рдорд┐рд▓рд╛:


рдЕрдВрддрд┐рдо рдХреЛрдб
 def _get_data_from_query(query: QuerySet) -> tuple: result = query.aggregate( _sum_payable=Sum(F('_payable_in_cur')), ) return result['_sum_payable'] or ZERO def output(partner_id: int): today = dt.date.today() partner = query_get_one(Partner.objects.filter(id=partner_id)) query = MetaOrder.objects.filter(partner=partner, content_type__in=[ Hotel.get_content_type(), Car.get_content_type(), Upsell.get_content_type(), ]) result = defaultdict(Decimal) query_annoted = query.annotate( _payment_pending=Coalesce( 'hotel__payment_pending', 'car__payment_pending', 'upsell__payment_pending', ), _payment_due=Coalesce( 'hotel__payment_due', 'car__payment_due', 'upsell__payment_due', ), _refund=Coalesce( 'hotel__refund', Value(ZERO) ), _refund_currency_rate=Coalesce( 'hotel__refund_currency_rate', Value(Decimal('1')) ), _sell=Coalesce( 'hotel__sell', Value(ZERO) ), _sell_currency_rate=Coalesce( 'hotel__sell_currency_rate', Value(Decimal('1')) ), ).annotate( # Calculated fields _sell_base=( F('_sell') * F('_sell_currency_rate') ), _refund_base=( F('_refund') * F('_refund_currency_rate') ), _payable_base=( F('_sell_base') - F('_refund_base') ), _reporting_currency_rate=Case( # Only hotels have currency_data, therefore we need a # check and default value When( content_type=Hotel.get_content_type(), then=RawSQL( '(hotel.currency_data->>%s)::numeric', (partner.reporting_currency,), ), ), output_field=DecimalField(), default=Decimal('1'), ), ) .annotate( _payable_in_cur=( F('_payable_base') / F('_reporting_currency_rate') ) ) before_payment_pending_query = _get_data_from_query( base_query_annotated.filter(_payment_pending__gt=today) ) after_payment_pending_before_payment_due_query = _get_data_from_query( base_query_annotated.filter( Q(_payment_pending__lte=today) & Q(_payment_due__gt=today) ) ) 

рдпрд╣ рдЕрдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


timing_after


count_after


рдирд┐рд╖реНрдХрд░реНрд╖


рддрд░реНрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдВрдмрджреНрдз рдореАрдЯреНрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рд░реВрдк рд╕реЗ рддреНрд╡рд░рд┐рдд рд╣реИрдВрдбрд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░ рджрд┐рдпрд╛ред рд╕рдорд╛рдзрд╛рди рдЕрдЪреНрдЫрд╛ рдирд┐рдХрд▓рд╛, рдФрд░ рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреНрдп рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдЗрд╕ рддрд░реНрдХ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред ORM рд╣рдорд╛рд░рд╛ рд╕рдм рдХреБрдЫ рд╣реИред


рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦреЗрдВ, рд╕рд╡рд╛рд▓ рдкреВрдЫреЗрдВ - рд╣рдо рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ! рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/hi447706/


All Articles