Django рдореЙрдбрд▓ рдкрд░ "рд╡рд┐рдХреГрддрд┐" рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛

рдЖрд▓рд╕реНрдп рдкреНрд░рдЧрддрд┐ рдХрд╛ рдЗрдВрдЬрди рд╣реИ


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


рд╕реЛрдЪрд┐рдП рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ


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

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

рдХреБрд▓: рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЬреЛ рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИ:


рдЬрдЧрд╣-рдЬрдЧрд╣ рдЧрдбреНрдвреЗ рд╣реИрдВ


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рд╕рдЬрд╛рд╡рдЯ рдереАред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ, '@foo' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдХреЗрд╡рд▓ рдЙрд╕ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рдПрдХ рдкреВрд░реНрдг рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рд╣рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХреЗрдВ?
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ '@' рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛ рдХрд╛рд░реНрдпреЛрдВ (g тАв f (x)) рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЬрдЧрд░ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдХреНрд▓рд╛рд╕ рджреЛрдиреЛрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ, рдФрд░ рд╣рдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рд░реНрдорд╛рдг '@' рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ (l (y)) тАв (f (x)), рдЬрд╣рд╛рдВ l (y) - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИред рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:

def foo(cls=None, param="DefaultValue"): def decorator(cls): # do something with class return cls if cls is None: return decorator else: return decorator(cls) 


рдХреБрдЫ рдЗрд╕реА рддрд░рд╣, рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде, рд▓реЙрдЧрд┐рди_рд╢реНрд░реЗрдгреА рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП django рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рдЖрдк рдШреВрдо рд╕рдХрддреЗ рд╣реИрдВ


рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдиреБрдХрд╕рд╛рди рдЙрдард╛рдП рдЧрдП рд╣реИрдВ, рдЕрдм рдЖрдк рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 def enable(cls=None, status=True, set_manager=True, mixin=False): ''' Adds enable field into cls or return mixin :param cls: class that would updates :param status: default value for enable field :type status: bool :param set_manager: sets if EnableManager is required :type set_manager: bool :param mixin: sets should be returned model mixin :type mixin: bool ''' def decorator(cls): ''' Adds field and manager if manager is required ''' cls.add_to_class('enabled', models.BooleanField(_('Enabled'), default=status)) if set_manager: cls.add_to_class('objects', EnableManager()) return cls class Class(models.Model): ''' Enable AbstractModels ''' enbaled = models.BooleanField(_('Enabled'), default=status) class Meta: abstract = True if cls and mixin: raise DecoratorMixinException elif mixin: if set_manager: Class.add_to_class('objects', EnableManager()) return Class elif cls: return decorator(cls) else: return decorator 


рдбреЗрдХреЛрд░реЗрдЯрд░рдорд┐рдХреНрд╕рд┐рдирдПрдХреНрд╕ рдЕрдкрд╡рд╛рдж рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реИ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рдХреНрд╕рд┐рди = рдЯреНрд░реВ рдХреЗ рд╕рд╛рде рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, add_to_class () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, django рдореЙрдбрд▓ рдХреА рдПрдХ рд╕реБрд╡рд┐рдзрд╛, рдпрджрд┐ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ = YourManager () рдпрд╛ cls.objects = YourManager () рд╡рд░реНрдЧ, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЙрд╕реА рдкрджреНрдзрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╣рдо рдЕрдкрдиреЗ рдореЙрдбрд▓ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг


 EnableFalseMixin = enable(status=false, mixin=True) class SimpleModel(EnableFalseMixin, models.Model): ''' Simple model ''' # some field here @enable class TestFalseEnable(models.Model): ''' Test enable ''' # some fields here @enable(status=false) class TestFalseEnable(models.Model): ''' Test enable ''' # some fields here 


рдЗрд╕ рд▓реЗрдЦ рдХреА рдХрд▓реНрдкрдирд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдВрддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЧрдИ рдереА рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рджреИрдирд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдИ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧреА рдкрд╛рдПрдЧрд╛ред Django рдврд╛рдВрдЪреЗ рдкрд░ рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВред

рдкреБрдирд╢реНрдЪ
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЪреМрдХрд╕ рд▓реЛрдЧ рдпрд╣ рд╢рдкрде рд▓реЗрдВрдЧреЗ рдХрд┐ "рд╕рдХреНрд╖рдо" рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдХреИрдкрд┐рдЯрд▓ рд╣реИ, рдЬреЛ PEP8 рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирдП рд╡рд░реНрдЧ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИред рдХреГрдкреНрдпрд╛ рдЕрдЬрдЧрд░ рдФрд░ рдбреАрдЬреЗрдЧреЛ, рдореБрдЭреЗ рдмрддрд╛рдУ рдХрд┐ рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рддрдирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдореИрдВ рдХреБрдЫ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдпрд╣ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрднреА рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕рд╣реА рд╣реИред

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


All Articles