_рдпрд╣ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреНрд░рд╢реНрди рдЖрдИрдПрдордУ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рд╣реИ_
рдореИрдВ рдиреЗрд╕реНрдЯреЗрдб рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ v2-рд╢рд╛рдЦрд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВред рдореИрдВ рдЪрдпрдирд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрд╕реНрдЯреЗрдб рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреНрд╖реЗрддреНрд░ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА QUERY_PARAMS
рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ perform_create
рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЗрд╕реЗ рдЕрдм v3-рд╢рд╛рдЦрд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдмрдЪрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдиреЗрд╕реНрдЯреЗрдб рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдореИрдВ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде context
рдХреЛ get_serializer_context
рдореЗрдВ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдореБрдЭреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрд╕реНрдЯреЗрдб рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ __init__
рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛?
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рдиреЗрд╕реНрдЯреЗрдб рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ context
рдФрд░ рди рд╣реА parent
рдореЗрдВ __init__
рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ! рддреЛ, рдпрд╣ рдкреБрд▓-рдЕрдиреБрд░реЛрдз 497 рдХреЗ рдмрд╛рдж рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдЧрдорди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдкреНрд░рддрд┐рдЧрдорди рдирд╣реАрдВ рд╣реИ, рдбрд┐рдЬрд╛рдЗрди рдкрд░рд┐рд╡рд░реНрддрди рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЗрд░рд┐рдЬрд╝рд▓рд╛рдЗрдЬрд╝рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!
рд╕рдВрджрд░реНрдн init рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдлрд╝реАрд▓реНрдб (рдпрд╛ рдиреЗрд╕реНрдЯреЗрдб рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░) рдХреЛ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рд╡реЗ рдореВрд▓ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдкрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ...
class MySerializer(Serializer):
child = ChildSerializer() <--- We've just initialized this.
MySerializer.__init__
рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдИ рднреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ...
def __init__(self, *args, **kwargs):
super(MySerializer, self).__init__(*args, **kwargs)
self.fields['child'].default = ...
рдЙрд╕ рд╕рдордп рдЖрдкрдХреЗ рдкрд╛рд╕ _do_ рд╕рдВрджрд░реНрдн рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред
рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░ рд╕рдХреЗрдВ, рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рдлрд╝реАрд▓реНрдб рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдмрдВрдзреА рд╣реЛ рдЬрд╛рддреА рд╣реИ ...
class ChildSerializer(Serializer):
def bind(self, *args, **kwargs):
super(ChildSerializer, self).bind(*args, **kwargs)
# do stuff with self.context.
рдЗрд╕реЗ рдирд┐рдЬреА рдПрдкреАрдЖрдИ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдореВрд▓ __init__
рд╢реИрд▓реА рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рд╣рд╛рдБ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕рдордЭрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ __ini__
рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдмрдирд╛рдирд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдиреЗрд╕реНрдЯреЗрдб рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ __init__
рд╣рд░ рдирдП рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирдиреЗ рдХреЗ рдмрд╛рдж рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреАрдкрдХреЙрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдореЗрдВ рдкреИрд░реЗрдВрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдЪреБрдкрдХреЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...
рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ v2 рдореЗрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдлрд╝реАрд▓реНрдб рдореЗрдВ initialize
рд╡рд┐рдзрд┐ рдереА, рдЬреЛ рдореВрд▓ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ init рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рдереАред
рддреЛ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ bind
рдЕрдЪреНрдЫрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕реЗ рдирд┐рдЬреА рдПрдкреАрдЖрдИ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдореВрд▓
__init__
рд╢реИрд▓реА рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ __init__
рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╡рд╛рддрд╛рд╡рд░рдг рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рд╕рдордп рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рдлрд╝реАрд▓реНрдб (рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░) рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдЪреАрдЬреЗрдВ рд╣реЛрддреА рд╣реИрдВ рдЙрдкрд▓рдмреНрдзред рдЬреИрд╕реЗ initialize
рдерд╛ред
рдХреНрдпрд╛ рдпрд╣ рдбреАрдЖрд░рдПрдл 2 рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
рдпрд╣ рдПрдХ рджрдпрд╛рд▓реБ рд╕рдВрджрд░реНрдн рд╣реИ рдЕрдм рдиреЗрд╕реНрдЯреЗрдб рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдПрдХ рджрдпрд╛рд▓реБ рд╕рдВрджрд░реНрдн рд╣реИ рдЕрдм рдиреЗрд╕реНрдЯреЗрдб рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдкрдХреЛ рд╡реЛ рдХрд╣рд╛рдБ рд╕реЗ рдорд┐рд▓рд╛ ? рдЕрдлреИрдХ, рд╕рдВрджрд░реНрдн _is_ рдиреЗрд╕реНрдЯреЗрдб рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред
@xordoquy рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ - рдореИрдВрдиреЗ рдирд╡реАрдирддрдо рдбреАрдЖрд░рдПрдл рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЯреЗрд╕реНрдЯрдХреЗрд╕ рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ :) рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред
@xiaohanyu рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдорд┐рд▓реА рд╣реИред рдФрд░ рдпрд╣ рдереЛрдбрд╝реЗ рдЕрдЬреАрдм рд╣реИ:
>>> serializer
Out[12]:
# Note there is context passed in constructor
CouponSerializer(<Coupon: Coupon Coupon #0 for offer Offer #0000>, context={'publisher': <User: John ZusPJRryIzYZ>}):
id = IntegerField(label='ID', read_only=True)
title = CharField(max_length=100, required=True)
short_title = CharField(max_length=30)
offer_details = OfferLimitedSerializer(read_only=True, source='offer'):
id = IntegerField(label='ID', read_only=True)
title = CharField(help_text='The Offer Title will be used for the Network, Advertisers and Publishers to identify the specific offer within the application.', read_only=True)
status_name = CharField(read_only=True, source='get_status_display')
is_access_limited = SerializerMethodField()
exclusive = BooleanField(required=False)
categories_details = OfferCategorySerializer(many=True, read_only=True, source='categories'):
id = IntegerField(read_only=True)
category = CharField(read_only=True, source='code')
category_name = CharField(read_only=True, source='get_code_display')
# all fields except one got context propagated
>>> [f.field_name for f in serializer.fields.values() if not f.context]
Out[20]:
['offer_details']
# offer_details is no different than categories_details, both are nested, read only, model serializers..
>>> serializer.fields['categories_details'].context
Out[21]:
{'publisher': <User: John ZusPJRryIzYZ>}
# lets look inside problematic serializer
>>> offer_details = serializer.fields['offer_details']
>>> offer_details
Out[25]:
OfferLimitedSerializer(read_only=True, source='offer'):
id = IntegerField(label='ID', read_only=True)
title = CharField(help_text='The Offer Title will be used for the Network, Advertisers and Publishers to identify the specific offer within the application.', read_only=True)
status_name = CharField(read_only=True, source='get_status_display')
url = SerializerMethodField()
is_access_limited = SerializerMethodField()
>>> offer_details.context
Out[23]:
{}
>>> offer_details._context
Out[24]:
{}
# ! surprisingly context is available inside fields... but not in the parent
>>> offer_details.fields['is_access_limited'].context
Out[26]:
{'publisher': <User: John ZusPJRryIzYZ>}
# context is available in all of them!
>>> [x.field_name for x in offer_details.fields.values() if not x.context]
Out[27]:
[]
@tomchristie рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ?
рдЗрд╕ рдмреАрдЪ рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╣реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛ рдкрдбрд╝рд╛:
class Serializer(serializers.Serializer):
def __init__(self, *args, **kwargs):
super(Serializer, self).__init__(*args, **kwargs)
# propagate context to nested complex serializers
if self.context:
for field in six.itervalues(self.fields):
if not field.context:
delattr(field, 'context')
setattr(field, '_context', self.context)
@pySilver рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рдмрд┐рдирд╛ рдЬреНрдпрд╛рджрд╛ рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЖрдк рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЛрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрджрд░реНрдн рдкреНрд░рд╕рд╛рд░ рдХреЛ рддреЛрдбрд╝рддреЗ рд╣реИрдВред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрдЯрд┐рд▓ mro
рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХрдИ рд╡рд░реНрдЧ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЗ рдмрдЪреНрдЪреЗ рд╣реИрдВред рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ред рдРрд╕рд╛ рдХреБрдЫ
class MyMixin(serializers.Serializer):
# some code within __init__, calling parent too
class MyModelSerializer(serializers.ModelSerializer):
# some code within __init__, calling parent too
class MyProblematicSerializer(MyModelSerializer, MyMixin)
# this one will not receive context somehow.
pass
рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ..
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
@xordoquy @tomchristie рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЬреАрдм рд╣реЛ рдЧрдИ :) рдЬрдм рднреА рдЖрдк self.context рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЕрдиреБрдкрд▓рдмреНрдз рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд┐рд╕реНрдордд рдХреЗ fields
рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЯреЗрд╕реНрдЯрдХреЗрд╕ рд╣реИ:
def test_serializer_context(self):
class MyBaseSerializer(serializers.Serializer):
def __init__(self, *args, **kwargs):
super(MyBaseSerializer, self).__init__(*args, **kwargs)
x = 0
if self.context.get('x'):
x = self.context['x']
class SubSerializer(MyBaseSerializer):
char = serializers.CharField()
integer = serializers.IntegerField()
class ParentSerializer(MyBaseSerializer):
with_context = serializers.CharField()
without_context = SubSerializer()
serializer = ParentSerializer(data={}, context={'what': 42})
assert serializer.context == {'what': 42}
assert serializer.fields['with_context'].context == {'what': 42}
assert serializer.fields['without_context'].context == {'what': 42}
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдЧреБрдЬрд░ рдЬрд╛рдПрдЧрд╛ред imho рдпрд╣ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдУрд╡рд░рд░рд╛рдЗрдб рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрдн рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ...
def test_serializer_context(self):
class MyBaseSerializer(serializers.Serializer):
<strong i="12">@property</strong>
def fields(self):
fields = super(MyBaseSerializer, self).fields
x = 0
if self.root.context.get('x'):
x = 1
return fields
class SubSerializer(MyBaseSerializer):
char = serializers.CharField()
integer = serializers.IntegerField()
class ParentSerializer(MyBaseSerializer):
with_context = serializers.CharField()
without_context = SubSerializer()
serializer = ParentSerializer(data={}, context={'what': 42})
assert serializer.context == {'what': 42}
assert serializer.fields['with_context'].context == {'what': 42}
assert serializer.fields['without_context'].context == {'what': 42}
рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП - рдореИрдВ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред
UPD: рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдВрддрд┐рдо рдХреЛрдб рднреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЫреВрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрджрд░реНрдн рдЦрддрд░рдирд╛рдХ рд╣реИред
рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ __init__
рдХреЗ рдкрд╛рд╕ рд╕рдВрджрд░реНрдн рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдлрд╝реАрд▓реНрдб рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╡рд╣ рдХрд╣рд╛рдБ рдХрд░реЗрдВрдЧреЗ?
рдпрд╣ bind
рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП self.fields['asdf'] = serializers.CharField()
ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝реАрд▓реНрдб рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдкрд╣рд▓реЗ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ рдЬрдм bind
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕реЗ fields
рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЛ рдмрд╣реБрдд рдХреБрдЫ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрд▓рд╕реА рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдХрд╛рд░рдг рдЗрд╕рдореЗрдВ self._fields
рдореЗрдВ рдПрдХ рдХреИрд╢рд┐рдВрдЧ рддрдВрддреНрд░ рд╣реИ рдЬрд┐рд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрдВрдХреНрд░реАрдЯ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╢ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝реАрд▓реНрдб рдХреЛ рдПрдХ рдмрд╛рд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдиреЗ рдкрд░ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
рдЗрд╕ рдХрджрд░:
class ChildSerializer(serializers.Serializer):
...
class ParentSerializer(serializers.Serializer):
child = serializers.NestedField(serializer=ChildSerializer)
рддрдм ChildSerializer
рдореЗрдВ рд╕рдВрджрд░реНрдн рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛ рд╕рдХрддреА рд╣реИ __init__
, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ ParentSerializer
рдореЗрдВ рд╕реАрдзреЗ рдХреНрд╖реЗрддреНрд░ рдШреЛрд╖рдгрд╛ рдореЗрдВ рддрддреНрдХрд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдпрджрд┐ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдлрд╝реАрд▓реНрдб рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╡рд╣ рдХрд╣рд╛рдБ рдХрд░реЗрдВрдЧреЗ?
рдЖрдЗрдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд▓реЗрдХрд░ рдЖрдЗрдП рдФрд░ рд╣рдо рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдиреЗ рдкрд░ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
рдХреЛрд╢рд┐рд╢ рдХрд░реЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдЙрд╕ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЬрд╛рдПрдВрдЧреЗред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рдЬреЛ рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕рдореЗрдВ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдмреНрд░реЗрдХ рд╣реИ, рд╕рд╛рде рд╣реА рдпрд╣ рдЖрдкрдХреЛ рдмрд╛рд▓ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдкрд░ рддрд░реНрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рд╢реИрд▓реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдз рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рдЗрд╕ рд╕рдордп рдмрджрд▓рддреЗ рд╣реБрдП рдирд╣реАрдВ рджреЗрдЦрддрд╛ред
@tomchristie рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓реЙрдЧ рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдиреЗрд╕реНрдЯреЗрдб рдмрд╛рд▓ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрдЯреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╣реИред
рдЯрд╛рдЗрдк рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХрднреА рднреА рдЯрд╛рдЗрдк рдмреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред
рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ:
class ChildSerializer(serializers.Serializer):
# relevant for all users
name = serializers.CharField()
# only relevant for users of Type A
phone = serializers.CharField()
# only relevant for users of Type B
ssn = serializers.CharField()
рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рджреЛрдиреЛрдВ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдЪрдЯреАрдПрдордПрд▓ рд░реВрдкреЛрдВ рдореЗрдВ, рдбреАрдЖрд░рдПрдл рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдФрд░/рдпрд╛ рдбреАрдЬреЗрдВрдЧреЛ рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рдирд╛, рдлрд╝реАрд▓реНрдб рдирд┐рдХрд╛рд▓рдирд╛, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛, рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рдореБрдЭреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХрднреА рдиреЗрд╕реНрдЯреЗрдб рдмрдЪреНрдЪреЗ рдореЗрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдФрд░ рдЗрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдЯрдореНрдкреНрдб рд╣реЛ рдЧрдпрд╛ред
@tomchristie рдореЗрд░рд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ рдЙрдиреНрд╣реЗрдВ рд╕рдВрджрд░реНрдн рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЖрдИрдбреА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред) рдЕрдм рддрдХ рдореБрдЭреЗ рдордЬрдмреВрд░ рд╣реЛрдирд╛ рдкрдбрд╝рд╛ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝реАрд▓реНрдб рдШреЛрд╖рдгрд╛ рдХреЗ рдмрдЬрд╛рдп ParentSerializer
рдХреА __init__
рд╡рд┐рдзрд┐ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб ChildSerializer
рдХреЛ рд╣рдореЗрд╢рд╛ рддрддреНрдХрд╛рд▓ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдордХрд╛рдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдХрджрд░:
class ChildSerializer(serializers.Serializer):
...
class ParentSerializer(serializers.Serializer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['child'] = ChildSerializer(context=self.context)
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкрдХрдбрд╝ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рд╡рд╣реА рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рд╣рд╛рдБред
рдЦреИрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╢рд╛рдпрдж рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдХрд╛рд░рдгред
рдмреБрдзрд╡рд╛рд░, 12 рдЕрдХреНрдЯреВрдмрд░, 2016 рдХреЛ рджреЛрдкрд╣рд░ 2:56 рдмрдЬреЗ +0200 рдмрдЬреЗ, "рдЯреЙрдо рдХреНрд░рд┐рд╕реНрдЯреА" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:
рд╡рд╣реА рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рд╣рд╛рдБред
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ, рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВред
рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ, рдЬрдм рдореИрдВрдиреЗ default
рд╡рд┐рд╢реЗрд╖рддрд╛ ( CurrentUserDefault()
рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рдХреЛ (рдиреЗрд╕реНрдЯреЗрдб) тАЛтАЛрд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ __init__
рд╡рд┐рдзрд┐ рдХреЛ рдЙрдк-рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ self.context
рд╡рд┐рд╢реЗрд╖рддрд╛, KeyError
рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ request
рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ (рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдпрд╛рдиреА рдпрд╣ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ)ред
рдЙрджрд╛рд╣рд░рдг рдХреЛрдб:
class UserSerializer(serializers.ModelSerializer):
# ...
def __init__(self, *args, **kwargs):
kwargs.pop('fields', None)
super().__init__(*args, **kwargs)
if 'list' in self.context: # Once I remove this, it will work
self.fields['friend_count'] = serializers.SerializerMethodField()
# ...
class CommentSerializer(serializers.ModelSerializer):
person = UserSerializer(read_only=True, default=serializers.CurrentUserDefault())
# ...
рддреНрд░реБрдЯрд┐ рд╕рдВрдЧреНрд░рд╣:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/api/comments/98/
Django Version: 1.9.7
Python Version: 3.4.3
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'rest_framework',
'rest_framework.authtoken',
'generic_relations',
'decorator_include',
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.facebook',
'allauth.socialaccount.providers.google',
'phonenumber_field',
'bootstrap3',
'stronghold',
'captcha',
'django_settings_export',
'main']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'stronghold.middleware.LoginRequiredMiddleware']
Traceback:
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/django/views/decorators/csrf.py" in wrapped_view
58. return view_func(*args, **kwargs)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/django/views/generic/base.py" in view
68. return self.dispatch(request, *args, **kwargs)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/rest_framework/views.py" in dispatch
466. response = self.handle_exception(exc)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/rest_framework/views.py" in dispatch
463. response = handler(request, *args, **kwargs)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/rest_framework/generics.py" in post
246. return self.create(request, *args, **kwargs)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/rest_framework/mixins.py" in create
20. serializer.is_valid(raise_exception=True)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/rest_framework/serializers.py" in is_valid
213. self._validated_data = self.run_validation(self.initial_data)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/rest_framework/serializers.py" in run_validation
407. value = self.to_internal_value(data)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/rest_framework/serializers.py" in to_internal_value
437. validated_value = field.run_validation(primitive_value)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/rest_framework/serializers.py" in run_validation
403. (is_empty_value, data) = self.validate_empty_values(data)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/rest_framework/fields.py" in validate_empty_values
453. return (True, self.get_default())
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/rest_framework/fields.py" in get_default
437. self.default.set_context(self)
File "/home/mikisoft/django-dev/lib/python3.4/site-packages/rest_framework/fields.py" in set_context
239. self.user = serializer_field.context['request'].user
Exception Type: KeyError at /api/comments/98/
Exception Value: 'request'
рдЬреЛрдбрд╝реЗ рдЧрдП рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдЖрдкрдХреЗ рдКрдкрд░ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рдХрд╣рд╛ рд╣реИ - рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВ __init__
рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрджрд░реНрдн рдХреА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ... рдЗрд╕рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рд╕реЗрдЯрд┐рдВрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджрд░реНрдн рдЙрд╕ рдореЗрдВ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдорд╛рдорд▓рд╛ред
рдареАрдХ рд╣реИ, рдореЗрд░реЗ рдлреЛрди рдкрд░ рдерд╛, рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ред
рдлрд┐рд░ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рд╢реАрд░реНрд╖ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рд╕реЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрддреНрдХрд╛рд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рджреВрд░ рдХрд░рдирд╛ рд╣реИред рддреЛ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ init рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдареАрдХред рдЖрдЦрд┐рд░реА рдиреЛрдЯ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рд╢реЛ рдХреА рддрд░рд╣, рдпрд╣ __init__
рд╡рд┐рдзрд┐ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди CurrentUserDefault()
рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ (рдЗрд╕рдХреЗ set_context
рдореЗрдВ) рддрд░реАрдХрд╛)ред рд▓реЗрдХрд┐рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ __init__
рдореЗрдВ рднреА рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдпрджрд┐ рд╕рдВрджрд░реНрдн рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕реАрдзреА рдХреЙрд▓ рдереА, рдпрд╛рдиреА рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд┐рдП рдмрд┐рдирд╛ (рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░рд╛ рд╕рдВрджрд░реНрдн рдЦрд╛рд▓реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рд╕рд╛рде рд╣реА, рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдЙрдкрд░реЛрдХреНрдд рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдХреЛрдИ рдШреЛрдВрд╕рд▓рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдФрд░ рдЬрдм рд╕рдВрджрд░реНрдн рддрддреНрдХрд╛рд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░рдЪрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереА, рдЗрд╕реЗ https://github.com/encode/django-rest-framework/pull/5304 рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ None
рдХреИрд╢рд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдИ рдореБрджреНрджреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдереЗ
рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдпрд╣ рд╡рд╣ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛:
class MyBaseSerializer(serializers.HyperlinkedModelSerializer):
def get_fields(self):
'''
Override get_fields() method to pass context to other serializers of this base class.
If the context contains query param "omit_data" as set to true, omit the "data" field
'''
fields = super().get_fields()
# Cause fields with this same base class to inherit self._context
for field_name in fields:
if isinstance(fields[field_name], serializers.ListSerializer):
if isinstance(fields[field_name].child, MyBaseSerializer):
fields[field_name].child._context = self._context
elif isinstance(fields[field_name], MyBaseSerializer):
fields[field_name]._context = self._context
# Check for "omit_data" in the query params and remove data field if true
if 'request' in self._context:
omit_data = self._context['request'].query_params.get('omit_data', False)
if omit_data and omit_data.lower() in ['true', '1']:
fields.pop('data')
return fields
рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ, рдореИрдВ рдПрдХ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддрд╛ рд╣реВрдВ рдЬреЛ get_fields()
рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ self._context
рдХреЛ рдХрд┐рд╕реА рднреА рдЪрд╛рдЗрд▓реНрдб рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рди рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╣реЛрддрд╛ рд╣реИред ListSerializers рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕рдХреЗ рдмрдЪреНрдЪреЗ рдХреЛ рд╕рдВрджрд░реНрдн рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реВрдВред
рдлрд┐рд░, рдореИрдВ рдПрдХ рдХреНрд╡реЗрд░реА рдкрд░рдо "omit_data" рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ "рдбреЗрдЯрд╛" рдлрд╝реАрд▓реНрдб рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ рдЕрднреА рднреА рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░ рдвреВрдВрдв рд░рд╣рд╛ рд╣реИред
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреБрд░рд╛рдирд╛ рдзрд╛рдЧрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореИрдВ __init__ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдиреБрд░реЛрдз (рд╕рдВрджрд░реНрдн рдореЗрдВ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдорд┐рдХреНрд╕рд┐рди рдкрд░ рдмрд╛рдВрдзрддрд╛ рд╣реВрдВред рдпрд╣ рдорд┐рд╢реНрд░рдг рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдкрд░ get_objects_for_user рд╡рд┐рдзрд┐ рдореМрдЬреВрдж рд╣реИ, рдпрд╛ рдЕрдиреНрдпрдерд╛ Guardian.shortcuts.get_objects_for_user рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдпрд╛ рдкреИрдЪрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рднреАред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝реАрд▓реНрдб рдШреЛрд╖рдгрд╛ рдХреЗ рдмрдЬрд╛рдп
ParentSerializer
рдХреА__init__
рд╡рд┐рдзрд┐ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдбChildSerializer
рдХреЛ рд╣рдореЗрд╢рд╛ рддрддреНрдХрд╛рд▓ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдордХрд╛рдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИредрдЗрд╕ рдХрджрд░:
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкрдХрдбрд╝ рд╣реИ рдпрд╛ рдирд╣реАрдВред