
рдЕрднрд┐рд╡рд╛рджрди, рд╣рдмреНрд░рд╛рд▓реАред рдХрд▓, рдЕрдЬрдЧрд░, Django рдХреЗ рд▓рд┐рдП рд▓реЛрдХрдкреНрд░рд┐рдп рд╡реЗрдм рдврд╛рдВрдЪреЗ рдХреЗ рдмреНрд▓реЙрдЧ рдкрд░, рдирдВрдмрд░ 1.6 рдХреЗ рддрд╣рдд рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдЦрдмрд░ рдереАред
рд╕рднреА рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА, рд╕рд╛рде рд╣реА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА (рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдкрд┐рдЫрдбрд╝реЗ рдЕрд╕рдВрдЧрдд рд╣реИрдВ), рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк
рд╕реЗ рдЬрд╛рд░реА рдиреЛрдЯреЛрдВ рдореЗрдВ рдкрд╛рдП рдЬрд╛рддреЗ
рд╣реИрдВ ред рдореЗрд░реА рднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рдмрд╛рд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ред
рдЗрд╕ рд╕рдорд╛рдЪрд╛рд░ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЕрдкрдиреА рд░рд╛рдп рдореЗрдВ, рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдореБрдЦреНрдп рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
1.6 рдореЗрдВ, рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдПрдкреАрдЖрдИ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ,
django.db.transaction
рдореЙрдбреНрдпреВрд▓
django.db.transaction
рдлрд╝рдВрдХреНрд╢рдВрд╕
autocommit()
,
commit_on_success()
рдФрд░
commit_manually()
рдЕрдм рдЕрдкреНрд░рдЪрд▓рд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ 1.8 рддрдХ рдХреА рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд░рд╣реЗрдЧрд╛ред рдЙрдиреНрд╣реЗрдВ
atomic()
рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдореБрдЦреНрдп рддрд░реНрдХ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ: рдкрд╣рд▓реЗ, рд▓реЗрдирджреЗрди рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдореБрдЦреНрдп рдмрд┐рдВрджреБ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рддрдВрддреНрд░ рдерд╛ - рдСрдЯреЛрдХреЙрдорд┐рдЯ (рдпрд╛рдиреА, рдкреНрд░рддреНрдпреЗрдХ SQL рдХреНрд╡реЗрд░реА рдПрдХ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд░рддреА рд╣реИ) рдпрд╛ рдореИрдиреБрдЕрд▓ рдХрдорд┐рдЯ (
COMMIT;
SQL рдХреНрд╡реЗрд░реА рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ)ред рд╕реНрд╡рддрдВрддреНрд░ рд▓реЗрдирджреЗрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕ рддрдВрддреНрд░ рдиреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдкреНрд░рдЪрд▓рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдиреЗрд╕реНрдЯреЗрдб рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ
commit_on_success()
рдПрдХ рджреВрд╕рд░реЗ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдмреНрд▓реЙрдХ рд╣реИрдВ, рддреЛ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдмреНрд▓реЙрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓реЗрдирджреЗрди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдмрд╛рд╣реНрдп рдмреНрд▓реЙрдХ рдХреА рдкрд░рдорд╛рдгреБрддрд╛ рдХреЛ рддреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдм рдХреНрдпрд╛ рд╣реЛрдЧрд╛: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдСрдЯреЛ рдХрдо рдореЛрдб рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдм рдЬрдВрдЧрд╛,
рдкреАрдИрдкреА 249 рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реБрдП рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд▓реЗрди-рджреЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрдВрддреНрд░
atomic()
, рдЬреЛ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рд╕реЗ рдбрд░рддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рд╣рд░реА рдмреНрд▓реЙрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рдмреНрд▓реЙрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, SQL рд╕реНрдЯреЛрд░реЗрдЬ
рдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдм
TransactionMiddleware
рдмрдЬрд╛рдп, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реНрдерд┐рд░рд╛рдВрдХ
ATOMIC_REQUESTS
, рдЬрдм рдЖрдк рдЗрд╕рдХреЗ рдорд╛рди рдХреЛ
True
(рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди
False
) рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, django рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред рдпрд╛рдиреА рдЕрдиреБрд░реЛрдз рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╛рдкрд╕ рдирд╣реАрдВред
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐
atomic()
рдХреЛ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдпрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
from django.db import transaction
рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣,
рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред
рд╕реНрдерд╛рдпреА рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди
рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рдкреБрд▓ рдХрдиреЗрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрди рдереНрд░реЗрдб рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╣рддрд░ рд╣реИ, рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рд░ HTTP рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рдирд┐рд░рдВрддрд░ рдХрдиреЗрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВред рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЙрдиреНтАНрдлрд╝рд┐рдЧрд░реЗрд╢рди
CONN_MAX_AGE
рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг
1.6 рдореЗрдВ, рдПрдХ рдирдпрд╛
django.test.runner.DiscoverRunner
рдЯреЗрд╕реНрдЯ
django.test.runner.DiscoverRunner
, рдЬреЛ
unittest2
рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдореЙрдбреНрдпреВрд▓ рдЦреЛрдЬ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрдм рдкрд░реАрдХреНрд╖рдг рдХрд┐рд╕реА рднреА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдореМрдЬреВрдж рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо
test*.py
рдорд╛рд╕реНрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ,
tests/__init__.py
рдФрд░
tests/__init__.py
рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдЙрдиреНрд╣реЗрдВ рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд)ред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдЙрдкрд╛рдп рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░
test_models.py
рдФрд░
tests/test.py
рдФрд░ рднреА, рдбреЙрдХреНрд╕ рдЕрдм рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ
рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛
рдкрд╛рд▓рди тАЛтАЛрдХрд┐рдП рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд╡реИрд╕реЗ, рдкреНрд░рдмрдВрдзрди рдЯреАрдо
./manage.py test
рдЕрдм
--pattern
рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЬреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдореБрдЦреМрдЯрд╛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рдмрдВрдзрди рдХреА рдЯреАрдо рдиреЗ рдЬрд╛рдВрдЪ рдХреА
django-admin.py check
рдХрдорд╛рдВрдб рдЕрдм рдЖрдкрдХреЛ рдЕрд╕рдВрдЧрдд рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрд▓рд░реНрдЯ рджреЗрддреЗ рд╣реБрдП, рдЬрдВрдЧрд▓ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЕрдиреБрдХреВрд▓рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдорд╛рдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рд╡реИрд╕реЗ, 1.6 рдЬрдВрдЧрд▓ рдХреА рдирд╡реАрдирддрдо рд░рд┐рд▓реАрдЬ рд╣реИ, рдЬреЛ рдЕрднреА рднреА рдЕрдЬрдЧрд░ рд╕рдВрд╕реНрдХрд░рдг 2.6 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред рдЕрдЧрд▓реЗ рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдХрдо рд╕реЗ рдХрдо 2.7 рдЕрдЬрдЧрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
ORM рд╕реБрдзрд╛рд░
QuerySet
рдЕрдм
first()
рдФрд░
last()
рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде
latest()
рдЕрд▓рд╛рд╡рд╛
earliest()
рд╕реЗ
earliest()
рддрд░реАрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЪреАрдиреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
ORM рдЕрдм рджрд┐рдирд╛рдВрдХ, рдФрд░ / рдпрд╛ рд╕рдордп рдХреЗ рд╕рд╛рде рдлрд╝реАрд▓реНрдб рдЦреЛрдЬрддреЗ рд╕рдордп рдкрд╣рд▓реЗ рдЬреЛрдбрд╝реЗ рдЧрдП
year
,
month
рдФрд░
day
рдЕрд▓рд╛рд╡рд╛
hour
,
minute
рдФрд░
second
рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рдЦреИрд░, рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдгред рдкреНрд░рддрд┐рд╢рдд рдЕрдиреБрдкрд╛рдд рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдкрд░ рдореБрдЦреНрдп рд╡рд┐рдХрд╛рд╕ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред