Django-rest-framework: рдиреЗрд╕реНрдЯреЗрдб рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рджреГрд╢реНрдп рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдлрд╝рд░ре░ 2015  ┬╖  26рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: encode/django-rest-framework

_рдпрд╣ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреНрд░рд╢реНрди рдЖрдИрдПрдордУ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рд╣реИ_

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

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

рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде context рдХреЛ get_serializer_context рдореЗрдВ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдореБрдЭреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрд╕реНрдЯреЗрдб рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ __init__ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛?

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рдиреЗрд╕реНрдЯреЗрдб рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ context рдФрд░ рди рд╣реА parent рдореЗрдВ __init__ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ! рддреЛ, рдпрд╣ рдкреБрд▓-рдЕрдиреБрд░реЛрдз 497 рдХреЗ рдмрд╛рдж рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдЧрдорди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝реАрд▓реНрдб рдШреЛрд╖рдгрд╛ рдХреЗ рдмрдЬрд╛рдп 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)

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкрдХрдбрд╝ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╕рднреА 26 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕рдВрджрд░реНрдн 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдпрд╛ рдкреИрдЪрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рднреАред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

aidanlister picture aidanlister  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

akhilputhiry picture akhilputhiry  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rjdp picture rjdp  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

thnee picture thnee  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

synic picture synic  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ