
Django рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 3 рдХреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рд▓реАрдЬ рдХреЗ рдХрдИ рд╣рдлреНрддреЗ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рд▓реАрдЬ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ Django рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд╛рдлреА рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ред рд╕рдВрд╕реНрдХрд░рдг 1.3 рдХрдИ рдмрд╛рд░ 1.7 рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 3 рдореЗрдВ рд╢рд╛рдЦрд╛ 2 рдореЗрдВ рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рдирд╣реАрдВред
рдореЗрд░рд╛ рд╡рд╛рдЗрдирдкреИрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ Django 1.3 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ, рдФрд░ рдЕрдм рддрдХ рдпрд╣ Django рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЛрдб рдХреЗ рд▓рдЧрднрдЧ 12% рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рдЪреБрдХрд╛ рд╣реИред
рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдпрд╛ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╕рдВрдкрд╛рджрди рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рд░реЛрдбрдореИрдк рдФрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдзреАрдореЗ рдмрджрд▓рд╛рд╡ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рдореИрдВ рдХреАрдбрд╝реЗ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рд╢реБрд░реВ рд╕реЗ рд╣реА рдорд╛рдирдХ рдкреНрд░рд╛рдкреНрдд django рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдереАред рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рдХреЛ рдпрд╛ рддреЛ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдЖрдкрдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрдИ рд╡рд╕реНрддреБрдПрдВ рдорд┐рд▓реАрдВ, рдпрд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИред
1 def get(self, *args, **kwargs): 2 clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs) 3 if self.query.can_filter() and not self.query.distinct_fields: 4 clone = clone.order_by() 5 limit = None 6 if not clone.query.select_for_update or connections[clone.db].features.supports_select_for_update_with_limit: 7 limit = MAX_GET_RESULTS 8 clone.query.set_limits(high=limit) 9 num = len(clone) 10 if num == 1: 11 return clone._result_cache[0] 12 if not num: 13 raise self.model.DoesNotExist() 14 raise self.model.MultipleObjectsReturned()
рдкрдВрдХреНрддрд┐ 9 рдЙрди рд╕рднреА рд░рд┐рдХреЙрд░реНрдбреЛрдВ рдХрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ рдЬреЛ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдПрдХ рд╕реЗрдЯ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реИред
рд╕рдВрд╕реНрдХрд░рдг 3 рд╕реЗ рдкрд╣рд▓реЗ, рдЕрдиреБрд░реЛрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ рдереАред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдХрдИ рдорд┐рд▓рд┐рдпрди рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ 1 рд╕реЗ рдЕрдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓рд╛ред рдЕрдм рд▓рд╛рдЗрдиреЗрдВ 5,7,8 рд╣реИрдВред рдФрд░ рдЕрдм рдЖрдк рдЧрд░реНрд╡ рд╕реЗ рдХреЗрд╡рд▓ MAX_GET_RESULTS = 21 рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ 1 рд╕реЗ рдЕрдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред
рднрд╛рд░реА "__init__" рдХреЗ рд╕рд╛рде рджреЗрд░реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧреАред рдЗрд▓рд╛рдЬ рдХреИрд╕реЗ рдХрд░реЗрдВ:
Django.db.models.query.py рдореЗрдВ MAX_GET_RESULTS рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ
GET рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд╣рд▓реЗ GET рдпрд╛ рдХреЙрд▓ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:
vars(queryset.query).update({'high_mark':2, 'low_mark':0}) queryset.query.set_limits(0,2)
OfInit__ Django рдореЙрдбрд▓ рдХреА рд╡рд┐рдзрд┐
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐ рдореЗрдВ __in__ рдХреЗ рдХреЛрдб рдореЗрдВ рдШреЛрд╖рдгрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ
_setattr=setattr
рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╕реНрдерд╛рдиреАрдп рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдХреЛрдб рдХреЛ рдЫрджреНрдо-рд╕рдЦреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
1. рдпрджрд┐ рдЖрдк __init__ рдореЙрдбрд▓ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛ = рдорд╛рди рдЬреЛрдбрд╝реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ "рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХреАрд╡рд░реНрдб рддрд░реНрдХ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛"ред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ __init__ рдкрджреНрдзрддрд┐ рдХреЛ рдмреЛрдЭ рди рдбрд╛рд▓реЗрдВ, рд▓реЗрдХрд┐рди рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП:
obj = MyClass() vars(obj).update({'attr':val, 'attr2':val2 ...})
2. рдирдП Django рдиреЗ рдореЙрдбрд▓ рдХреЗ рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ (Field.descriptor_class) рдкрд░ рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ред рд▓реЗрдХрд┐рди рдПрдХ рднреА рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкреНрд░реАрдлрд╝реИрдЪ_рд░реЗрд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЬреЛ рдореБрдЦреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж рд╣реА рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
рдореИрдВ рдЖрд░рдВрдн рдХреЗ рдЕрдВрдд рдХреЗ рд╕рдВрдХреЗрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧреНрд░рд╛рд╣рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ __init__ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдХрд░ рдХреБрдЫ рднреА рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдирд╣реАрдВ рдЖрдпрд╛ред
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._end_init = True
рдХреНрд╡реЗрд░реАрд╕рдореВрд╣реЛрдВ
рд╣рд╛рд░реНрдбрдХреЛрдб EmptyQuerySet / DateQuerySet рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдПрдХ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ред
рдпрджрд┐ рдореИрдВ рдкреНрд░рдмрдВрдзрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рд╡рд░реНрдЧ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ _queryset_class рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ
class MyManager(models.Manager): _queryset_class = MyQuerySet
рдзреНрдпрд╛рди рджреЗрдВ, рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
class MyManager(models.Manager): def get_query_set(self): response = super(MyManager, self).get_query_set() response.__class__ = MyQuerySet return response
рдЗрдирд▓рд╛рдЗрдирдлрд╝реЙрд░реНрдорд╕реЗрдЯ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓
рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
1. рдорд╛рдирдХ рдЗрдирд▓рд╛рдЗрдирдлрд╝реЙрд░реНрдорд╕реЗрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рд╕рдВрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЙрддреНрдкрд╛рдж рдХреА рдХреАрдорддреЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЙрд░реНрдоред рдмреАрдЪ рдореЗрдВ "рд╕рдорд╛рди" рд╕рд╛рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдереЛрдХ рдЦрд░реАрдж рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдЯреИрдмреБрд▓рд┐рдирд▓рд╛рдЗрди рд░реВрдк рдирд┐рд╣рд┐рдд рд╣реИред
рдпрд╣ get_formset рдЗрдирд▓рд╛рдЗрди рдореЙрдбрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдФрд░ BaseInlineFormSet рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдЕрдкрдиреА рдЦреБрдж рдХреА MyFormSet рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
def get_formset(self, request, obj=None, **kwargs): kwargs['formset'] = MyFormSet super().get_formset(request, obj, **kwargs) class MyFormSet(BaseInlineFormSet): pass
2. рдпрджрд┐ рдЖрдк рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдПрдХ рдЗрдирд▓рд╛рдЗрдирдлреЙрд░реНрдорд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕рдордп рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдирд▓рд╛рдЗрдирдлреЙрд░реНрдо рдХреЗ рдЕрдВрджрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛, рддреЛ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреА рдФрд░ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдХреЗрд╡рд▓ рдПрдХ рдирдИ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдХреЛрдкреА рдкреЗрд╕реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред
рдореБрдЭреЗ рдЕрдм рддрдХ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд╣реИ - рдЗрдирд▓рд╛рдЗрдирдлрд╝реЙрд░реНрдорд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред
рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓
Django рдХреА "рд╣рддреНрдпрд╛рд░рд╛ рд╕реБрд╡рд┐рдзрд╛", рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдХреИрдХреНрдЯрд╕ рд╣реИ:
1. рдореЙрдбрд▓ рдкреНрд░рд╢рд╛рд╕рдХ рдореЗрдВ "рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛рдПрдВ" рдХрд╛рд░реНрд░рд╡рд╛рдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╣рдЯрд╛рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
рдпрд╣ рдЗрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
admin.site.disable_action('delete_selected')
2. рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХрд╛рд░ рдмрдирд╛рдирд╛ рддрдм рддрдХ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдЖрдк рдореЙрдбрд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЛ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
from django.contrib.auth.models import Permission class PermissionsAdmin(admin.ModelAdmin): search_fields = ('name', 'codename','content_type__app_label', 'content_type__model') list_display = ('name', 'codename',) actions = None admin.site.register(Permission, PermissionsAdmin)
3. рдХрд╛рд╢, Django рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред
рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде djangoAdminLog рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд▓рд┐рдЦрдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рдлрд┐рд░ рдзреНрд╡рдЬ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
user.logentry_set.filter(action_flag=ENABLED, .....).exists()
4. рдпрджрд┐ рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкреНрд░рд╢рд╛рд╕рдХ рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдБ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╡реЗ djangoAdminLog рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рд╣реИрдВред
5. рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЗрд╕ рднрд╛рдЧ рдХрд╛ рдПрдХ рдФрд░ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╣реИрдВред рд▓реЗрдХрд┐рди GCBV рдХрд╛ рдХреНрдпрд╛? рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдореЙрдбрд▓ рдкреНрд░рд╢рд╛рд╕рдХреЛрдВ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ GCBV рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рднрдВрдбрд╛рд░редрдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрдиреЗрдХреНрд╢рди рдорд╛рдирдХ рд╣реИ:
class MyAdmin(admin.ModelAdmin): actions = (MyActionBasedOnActionView.as_view(),)
ContentType - django рдореЙрдбрд▓ рд░рдЬрд┐рд╕реНрдЯреНрд░реА
50% рдкреНрд░рддрд┐рднрд╛ / 50% рдиреАрд░рд╕рддрд╛ред
рдХрд┐рд╕реА рднреА рдореЙрдбрд▓ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЙрдбрд▓ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рд╢реНрд░рдг рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
from django.contrib.contenttypes.models import ContentType class ExportMixin(object): @classmethod def ct(cls): if not hasattr(cls, '_ct'): cls._ct, create = ContentType.objects.get_or_create(**cls.get_app_model_dict()) if create: cls._ct.name = cls._ct.model._meta.verbose_name cls._ct.save() return cls._ct @classmethod def get_model_name(cls): if not hasattr(cls, '_model_name'): cls._model_name = cls.__name__.lower() return cls._model_name @classmethod def get_app_name(cls): if not hasattr(cls, '_app_name'): cls._app_name = cls._meta.app_label.lower() return cls._app_name @classmethod def get_app_model_dict(cls): if not hasattr(cls, '_format_kwargs'): cls._format_kwargs = {'app_label': cls.get_app_name(), 'model': cls.get_model_name()} return cls._format_kwargs
рдЕрдм рд╣рдо рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ obj.ct () рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
UserModel
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╕рдВрд╕реНрдХрд░рдг 1.5 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреАред
рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 3 рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдорд╛рдирдХ UserCreationForm / UserChangeForm рдореЗрдВ рдореЙрдбрд▓ = рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
from django.contrib.auth.forms import UserCreationForm from django.contrib.auth import get_user_model class MyUserCreationForm(UserCreationForm): class Meta: model= get_user_model()
рдЕрдиреБрд╡рд╛рдж рдкреНрд░рдгрд╛рд▓реА
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдЯреИрдЧ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд╣реИрдВ
{% trans %}
рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдб рдореЗрдВ
gettext_lazy
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдЗрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдХреЛрдИ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рд╣реИред рдЖрдо рддреМрд░ рдкрд░ред
рдмрд╛рд╣рд░реА рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рд╡реЗ рд╕рднреА рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реЛрд╕реЗрдЯрд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рда рдЦреЛ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдХрд╣реАрдВ рднреА рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рд╣реИред рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд┐рдд makemessages / compilemessages рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ...
рд╡рд╛рдЗрдирдкреИрдб рдореЗрдВ, рдЯреНрд░рд╛рдВрд╕, рдмреНрд▓реЙрдХрдЯреНрд░рд╛рдВрд╕ рдФрд░ рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ_рд▓реИрдЬ рдЯреИрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд╣рдордиреЗ рдХреИрд╢ рд╕реЗ рдЧреНрд░рдВрде рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдпрджрд┐ рдХреЛрдИ рдХреИрд╢ рдирд╣реАрдВ рд╣реИ, рддреЛ get_or_create рдЖрдзрд╛рд░ рд╕реЗ рдХреИрд╢ рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдз рдиреЗ рд╣рдореЗрдВ makemessages рд╕реЗ рднреА рдмрдЪрд╛рдпрд╛ред
рдмрд╣реБрднрд╛рд╖рд╛рд╡рд╛рдж рдХрд╛ рд╡рд┐рд╖рдп рдЖрдо рддреМрд░ рдкрд░ рдЬрдЯрд┐рд▓ рд╣реИред Django рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рдкрд╛рдареЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЗрди рдореЙрдбрд▓реЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ
django-TOF рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкрд╛рдареЛрдВ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬрд╣рд╛рдБ рдореИрдВрдиреЗ рдореЙрдбрд▓-рдЕрдиреБрд╡рд╛рдж рдФрд░ Parler / Hvad рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ред рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдЭрд╛рдВрдХрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреАред
рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрдерд╛ рдХреЛ рд░реЛрдХ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ Django рдмрдЧ рдлрд┐рдХреНрд╕ рд▓реЗрдЦ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд▓реЙрдиреНрдЧреНрд░реЗрдб рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред
рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ Django рдХреЛ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЙрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЙрддреНрдкрдиреНрди рд╣реБрдП рд╣реИрдВред
ps рдХреБрдЫ рдХреЛрдб рдкреБрд░рд╛рдиреА рд╕рдВрдХреЗрддрди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдордп рдпрд╛ рд╕реНрдЯрд╛рдл рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред