рдирдореВрдиреЛрдВ рд╕реЗ рдирд╛рдорд╛рдВрдХрд┐рдд tuples

Django рдореЗрдВ, рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, QuerySet рд╡рд┐рдзрд┐рдпрд╛рдВ values() рдФрд░ values_list() ред рдореЙрдбрд▓ рдХреЗ рдмрдЬрд╛рдп рдкрд╣рд▓рд╛ рд╢рдмреНрджрдХреЛрд╢ рд╢рдмреНрджрдХреЛрд╢реЛрдВ, рджреВрд╕рд░рд╛ tuples рджреЗрддрд╛ рд╣реИред рдпрд╣ рджреЛрдиреЛрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЛрдЧ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирдХ collections рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдирд╛рдорд┐рдд рдЯреНрдпреВрдкрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рд╛ред

рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрднреА рддрдХ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реИрдВ, рдореИрдВ рдЪреАрдЬреЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдХреЛрдб рджреЗ рджреВрдВрдЧрд╛:
qs = Item . objects . filter( ... )
for item in qs:
print item . title, item . amount
total += item . amount * item . price

#
qs = Item . objects . filter( ... ) . values( 'title' , 'amount' , 'price' )
for item in qs:
print item[ 'title' ], item[ 'amount' ]
total += item[ 'amount' ] * item[ 'price' ]

#
qs = Item . objects . filter( ... ) . values_list( 'title' , 'amount' , 'price' )
for item in qs:
print item[ 0 ], item[ 1 ]
total += item[ 1 ] * item[ 2 ]

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

рдЯреБрдкрд▓реНрд╕ рдирд╛рдо рдХреНрдпрд╛ рд╣реИрдВ?


рдирд╛рдорд┐рдд рдЯреНрдпреВрдкрд▓реНрд╕ рдкрд╛рдпрдерди 2.6 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдП рдФрд░ рд╡реЗ рдЯреНрдпреВрдкрд▓ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдкрд╣реБрдВрдЪ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрднрд╡ рд╣реИред рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЯреБрдХрдбрд╝рд╛:
>>> from collections import namedtuple
>>> Point = namedtuple( 'Point' , 'x y' . split())
>>> p = Point(x =11 , y =22 ) #
>>> p2 = Point( 11 , 22 ) # ...
>>> p1 == p2
True
>>> p[ 0 ] + p[ 1 ] #
33
>>> x, y = p # ...
>>> x, y
(11, 22)
>>> p . x + p . y #
33
>>> Point . _make([ 11 , 22 ]) #
Point(x=11, y=22)

NamedTuplesQuerySet


рдпрд╣ QuerySet рдХрд╛ рдПрдХ рд╡рдВрд╢рдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЬреЛ QuerySet рдирд╛рдо рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╕рднреА рдХреНрд╡реЗрд░реА рддрд░реНрдХ ValuesQuerySet ( QuerySet.values() рд╕реЗ рд▓реМрдЯреЗ QuerySet.values() рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП ValuesQuerySet , рд╣рдо рдХреЗрд╡рд▓ рдЬрд╛рд░реА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
from itertools import imap
from collections import namedtuple

from django.db.models.query import ValuesQuerySet

class NamedTuplesQuerySet (ValuesQuerySet):
def iterator ( self ):
#
extra_names = self . query . extra_select . keys()
field_names = self . field_names
aggregate_names = self . query . aggregate_select . keys()
names = extra_names + field_names + aggregate_names

#
tuple_cls = namedtuple( ' %s Tuple' % self . model . __name__, names)

results_iter = self . query . get_compiler( self . db) . results_iter()
#
return imap(tuple_cls . _make, results_iter)

рдФрд░, рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рд╣рдо QuerySet рдХреЛ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:
from django.db.models.query import QuerySet

def namedtuples ( self , * fields):
return self . _clone(klass = NamedTuplesQuerySet, setup = True , _fields = fields)
QuerySet . namedtuples = namedtuples

рдЙрд╕рдХреЗ рдмрд╛рдж, рдореЙрдбрд▓, рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдФрд░ рдЯреБрдкрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
qs = Item . objects . filter( ... ) . namedtuples( 'title' , 'amount' , 'price' )
for item in qs:
print item . title, item . amount
total += item . amount * item . price

рдпрд╣ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рд╡рд░реНрдЧ рджреЛрдиреЛрдВ рдЙрдкрд▓рдмреНрдз рддреНрд╡рд░рдХ values() рдФрд░ values_list() рджреЛрдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдпрд╛ рддреЛ рдмреЗрд╣рддрд░ рдпрд╛ рд▓рдЧрднрдЧ рд╕рд╛рде рд╣реА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдХрд┐рд╕реА рджрд┐рди рдпрд╣ рдЙрдирдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред

рдкреБрдирд╢реНрдЪ рдкреИрдЪ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рдХреЛрдб рдпрд╣рд╛рдБ рд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ gist.github.com/876324
PPS рдЯреНрдпреВрдкрд▓ рдореЗрдВ рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛ рдХреНрд░рдо рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рддрд░реНрдХреЛрдВ nametuples() рдХреЗ рдХреНрд░рдо рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд╝реАрд▓реНрдб ValuesListQuerySet.iterator() рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ ValuesListQuerySet.iterator() рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


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


All Articles