{"id":386595,"date":"2024-06-29T06:48:52","date_gmt":"2024-06-29T06:48:52","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=386595"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T06:48:52","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=386595","title":{"rendered":"<span>\u041e\u043a\u0435\u0439, \u0414\u0436\u0430\u043d\u0433\u043e, \u0443 \u043c\u0435\u043d\u044f \u043a \u0442\u0435\u0431\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/4ca\/fa7\/955\/4cafa79551cddfe4cc85d019c512db59.jpg\" width=\"1600\" height=\"800\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4ca\/fa7\/955\/4cafa79551cddfe4cc85d019c512db59.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e, \u0438 \u043c\u0435\u043d\u044f \u0441\u043f\u0440\u043e\u0441\u0438\u043b\u0438, \u043f\u0438\u0448\u0443 \u043b\u0438 \u044f \u043d\u0430 flask, \u043d\u0430 \u0447\u0442\u043e \u044f \u043e\u0442\u0432\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u044f \u0441\u0435\u0431\u044f \u043b\u044e\u0431\u043b\u044e, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0438\u0448\u0443 \u043d\u0430 django. \u041c\u0435\u043d\u044f \u043d\u0435 \u0432\u0437\u044f\u043b\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e, \u043a\u0445\u043c, \u0443 \u043d\u0438\u0445, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0431\u044b\u043b\u043e \u043d\u0430 \u0444\u043b\u0430\u0441\u043a\u0435, \u0438 \u0432\u044b\u0448\u043b\u043e \u043d\u0435\u043b\u043e\u0432\u043a\u043e. \u0414\u0430-\u0434\u0430, \u044f \u0437\u043d\u0430\u044e, \u0444\u043b\u0430\u0441\u043a \u043a\u0440\u0443\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0432\u0441\u0451 \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0442\u0430\u0432\u0438\u0448\u044c \u0441\u0430\u043c, \u0430 \u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u0442\u0430\u043c \u0438 \u0442\u0430\u043a \u043d\u0435\u0442, \u043d\u043e \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f django.<\/p>\n<p>\u0418 \u0442\u0443\u0442, \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044f \u044f \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c \u0414\u0436\u0430\u043d\u0433\u043e, \u0445\u043e\u0436\u0443 \u043f\u043e \u0434\u043e\u043c\u0430\u043c, \u0441\u0442\u0443\u0447\u0443 \u0432 \u0434\u0432\u0435\u0440\u0438 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e, \u043a\u0430\u043a \u043a\u0440\u0443\u0442\u043e \u043d\u0430 \u043d\u0451\u043c \u043a\u043e\u0434\u0438\u0442\u044c, \u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u043d\u0435\u0442 &#8212; \u0414\u0436\u0430\u043d\u0433\u043e \u0442\u043e\u0436\u0435 \u043d\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c&#8230; \u0412\u043e\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u044f \u0438 \u0445\u043e\u0447\u0443 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c.<\/p>\n<h2>Async<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u043e\u0442 \u0442\u0430\u043a: \u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0435\u043c\u0443 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 &#171;\u0432 \u0414\u0436\u0430\u043d\u0433\u043e 3.0 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438&#187;? \u041d\u0443 \u043a\u0430\u043a, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u041f\u0435\u0442\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443, \u0432\u043e\u0440\u043a\u0435\u0440 \u043f\u0440\u0438\u043d\u044f\u043b \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043d\u0443\u043b \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u0441\u0432\u043e\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u044b\u0433\u0430\u0435\u0442 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0443\u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442 \u0412\u0430\u0441\u0438, \u043f\u0438\u043d\u0430\u0435\u0442 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u0441\u0432\u043e\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043f\u0440\u044b\u0433\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a \u041f\u0435\u0442\u0435&#8230; \u041d\u0443 \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438.<\/p>\n<p>\u0422\u0430\u043a-\u0442\u043e \u043e\u043d\u043e \u0442\u0430\u043a, \u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0438 \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u0442\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c: \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043d\u0438\u0445\u0440\u0435\u043d\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041f\u043e\u0447\u0435\u043c\u0443? \u041d\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 django ORM \u0432\u0441\u0451 \u0435\u0449\u0451 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f:<\/p>\n<blockquote>\n<p>We\u2019re still working on async support for the ORM and other parts of Django. You can expect to see this in future releases. For now, you can use the <code>sync_to_async()<\/code> adapter to interact with the sync parts of Django.<\/p>\n<\/blockquote>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u0432\u0430\u043c \u043c\u0430\u043b\u043e, \u0442\u043e \u0432\u043e\u0442 \u0435\u0449\u0451: \u043d\u0435 \u0432\u0441\u0435 middleware \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 async. \u041a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0414\u0436\u0430\u043d\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0432\u0438\u0434\u0435 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f:<\/p>\n<blockquote>\n<p>Middleware can be built to support <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/topics\/http\/middleware\/#async-middleware\" rel=\"noopener noreferrer nofollow\">both sync and async<\/a> contexts. Some of Django\u2019s middleware is built like this, but not all. To see what middleware Django has to adapt, you can turn on debug logging for the <code>django.request<\/code> logger and look for log messages about <em>\u201cSynchronous middleware \u2026 adapted\u201d<\/em>.<\/p>\n<\/blockquote>\n<p>\u041d\u0443 \u044f \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b, \u043c\u043d\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0432\u0435\u043b\u043e\u0441\u044c. \u0412\u043e\u0442 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0447\u0435\u043b &#8212; \u0443 \u043d\u0435\u0433\u043e <a href=\"https:\/\/stackoverflow.com\/questions\/66471951\/how-can-i-check-which-django-middleware-is-synchronous-or-asynchronous\" rel=\"noopener noreferrer nofollow\">\u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c<\/a>. \u0417\u043d\u0430\u0447\u0438\u0442, \u0432\u0441\u0435 middleware \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435? \u041d\u0443 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e&#8230;<\/p>\n<p>\u041d\u043e \u0438 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0432\u0441\u0451! \u042f \u0434\u0430\u0436\u0435 \u0431\u043e\u044e\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0442\u0430\u0440\u0435\u0435\u043a \u0432\u0441\u0451 \u0435\u0449\u0451 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438. \u041d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e <code>pip install django-whatever<\/code> \u0438 \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 async.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e async django &#8212; \u044d\u0442\u043e \u0445\u043e\u0434\u044c\u0431\u0430 \u043f\u043e \u043c\u0438\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044e: \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435\u0441\u044c \u0432 &#171;async scope&#187;, \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u043c \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u043d\u0435\u0432\u0430\u0436\u043d\u043e \u0433\u0434\u0435 &#8212; \u0432 middleware, \u0438\u043b\u0438 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0411\u0414, \u0438\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0430 \u044e\u0437\u0430\u0435\u0442 requests, \u0430 \u043d\u0435 httpx &#8212; \u0442\u043e \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c, \u0438\u043b\u0438 \u043e\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0441 \u043f\u043e\u0442\u0435\u0440\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u042f \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442 &#8212; \u043c\u043d\u0435 \u0432\u0441\u0451 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0445\u0440\u0435\u043d\u0430\u043a-\u0445\u0440\u0435\u043d\u0430\u043a, \u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432. \u041d\u043e \u0442\u0443\u0442 \u0434\u0430\u0436\u0435 \u044f \u043f\u0430\u0441\u0443\u044e \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0447\u0430\u0441\u043e\u0432, \u043d\u0443\u0436\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0414\u0436\u0430\u043d\u0433\u043e \u043d\u0430 async.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/topics\/async\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0430\u043c\u0438<\/a>, \u043a\u0430\u043a \u0414\u0436\u0430\u043d\u0433\u043e \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u0434\u0432\u0443\u0445 \u0441\u0442\u0443\u043b\u044c\u044f\u0445 &#8212; sync \u0438 async &#8212; \u043d\u043e \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442, \u0447\u0442\u043e \u0414\u0436\u0430\u043d\u0433\u043e \u0442\u0430\u043a \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c, \u043e\u0442\u0434\u0430\u0432\u0430\u044f async \u0432 \u0440\u0443\u043a\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432.<\/p>\n<h2>\u0411\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0438<\/h2>\n<p>\u0414\u0436\u0430\u043d\u0433\u043e \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442 \u0441\u0432\u043e\u0438\u043c\u0438 \u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0430\u043c\u0438. \u0412\u043e\u0437\u044c\u043c\u0438\u0442\u0435 \u0441\u0432\u043e\u044e \u0441\u0430\u043c\u0443\u044e \u0431\u0435\u0437\u0443\u043c\u043d\u0443\u044e \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u044e, \u0438 \u0434\u043b\u044f \u043d\u0435\u0451 \u043d\u0430\u0439\u0434\u0451\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0414\u0436\u0430\u043d\u0433\u043e. \u0425\u043e\u0441\u043f\u0430\u0434\u0435, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0432\u0441\u0451, \u0434\u0430\u0436\u0435 <a href=\"http:\/\/whitenoise.evans.io\/en\/stable\/\" rel=\"noopener noreferrer nofollow\">whitenoise<\/a> \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u043b\u0435\u043d\u044c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c nginx.<\/p>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u0436\u0435 Django \u0435\u0441\u0442\u044c \u0442.\u043d. <code>django.contrib<\/code> \u043f\u0430\u043f\u043a\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u0443\u0447\u0430 \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0438 \u043d\u0435\u0442\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<h3>Sites framework<\/h3>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0445\u043e\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u0439\u0442\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438.<\/p>\n<p>\u0418 \u043b\u0430\u0434\u043d\u043e \u0431\u044b \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 &#8212; \u043d\u0443 \u0442\u0430\u043c \u0443 \u0432\u0430\u0441 \u043c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u043e\u0432 \u0438 \u0432\u044b \u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0435 \u043f\u043e <code>SITE_ID<\/code> \u0432 <code>settings.py<\/code> (\u0447\u0442\u043e \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u044f \u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u043b \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u043c\u0443 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443, \u0442\u0438\u043f\u0430 <code>kuku.com<\/code> \u0438 <code>haha.net<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e &#171;database ID&#187;, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f <code>SITE_ID<\/code>, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445). \u041d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435, \u0442\u043e <strong>\u0434\u0436\u0430\u043d\u0433\u043e \u0441\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0432\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/ref\/contrib\/sites\/#how-django-uses-the-sites-framework\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a> <em>\u0442\u0440\u0435\u0431\u0443\u044e\u0442<\/em> \u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0423\u0440\u0430, \u0441\u043f\u0430\u0441\u0438\u0431\u043e.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0445\u043e\u0445\u043c\u0430 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438:<\/p>\n<blockquote>\n<p>You can use the sites framework in your Django views to do particular things based on the site in which the view is being called. For example:<\/p>\n<\/blockquote>\n<pre><code class=\"python\">from django.conf import settings  def my_view(request):     if settings.SITE_ID == 3:         # Do something.         pass     else:         # Do something else.         pass<\/code><\/pre>\n<p>\u042f \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u0440\u044b\u043b \u0440\u043e\u0442, \u0447\u0442\u043e \u0442\u0443\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Magic_number_(programming)\" rel=\"noopener noreferrer nofollow\">magic number<\/a>, \u043d\u043e \u0414\u0436\u0430\u043d\u0433\u043e \u043c\u0435\u043d\u044f \u043e\u043f\u0435\u0440\u0435\u0434\u0438\u043b:<\/p>\n<blockquote>\n<p>It\u2019s fragile to hard-code the site IDs like that, in case they change. The cleaner way of accomplishing the same thing is to check the current site\u2019s domain:<\/p>\n<\/blockquote>\n<pre><code class=\"python\">from django.contrib.sites.shortcuts import get_current_site  def my_view(request):     current_site = get_current_site(request)     if current_site.domain == 'foo.com':         # Do something         pass     else:         # Do something else.         pass<\/code><\/pre>\n<p>\u0410, \u043d\u0435\u0442, \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e &#171;magic number&#187; \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u043d\u0430 &#171;hardcoded value&#187; (\uff0d\u2038\u10da)<\/p>\n<h3>Env vars<\/h3>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f &#8212; \u044d\u0442\u043e \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 django \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e, \u0438 \u043e\u043d \u0432\u0430\u0441 \u0443\u0447\u0438\u0442 \u0438\u0445 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c &#8212; \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<h3>Tests<\/h3>\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0441\u0442\u044c pytest &#8212; \u0443\u0434\u043e\u0431\u043d\u043e, \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0433\u0438\u0431\u043a\u043e. \u041d\u043e \u043c\u0430\u043b\u043e \u043a\u0442\u043e \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0443 pytest \u0435\u0441\u0442\u044c <a href=\"https:\/\/lurkmore.to\/%D0%A4%D0%B0%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BE%D0%BA\" rel=\"noopener noreferrer nofollow\">\u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a<\/a>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0434\u0436\u0430\u043d\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, <a href=\"https:\/\/www.reddit.com\/r\/django\/comments\/jcbrh5\/django_testing_vs_pytestdjango\/\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435<\/a>, <a href=\"https:\/\/stackoverflow.com\/questions\/44558018\/django-test-vs-pytest\" rel=\"noopener noreferrer nofollow\">\u0445\u0443\u0436\u0435<\/a>.<\/p>\n<h3>\u041e\u0442\u043b\u0430\u0434\u043a\u0430<\/h3>\n<h4>\u041e\u0442\u0447\u0451\u0442\u044b<\/h4>\n<p>\u0414\u0436\u0430\u043d\u0433\u043e \u043f\u0438\u0448\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u043e\u0442\u0447\u0451\u0442\u044b \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445. \u041d\u043e \u043d\u0435 \u0434\u0430\u0439 \u0431\u043e\u0433 \u0443 \u0432\u0430\u0441 \u043d\u0435 500 internal server error, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442.  \u0418 \u0445\u043e\u0442\u044f \u0432\u043e\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u0440\u044f\u0434\u043e\u043c \u043b\u0435\u0436\u0438\u0442 <a href=\"https:\/\/django-debug-toolbar.readthedocs.io\/en\/latest\/\" rel=\"noopener noreferrer nofollow\">django-debug-toolbar<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0411\u0414 \u0441 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0430\u043c\u0438!), \u0432 Django \u043e\u043d\u043e \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e&#8230; \u043d\u0443 \u043d\u0435 \u0437\u043d\u0430\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0432\u0430\u0436\u043d\u043e, \u043a\u0430\u043a sites framework.<\/p>\n<p>\u041d\u043e \u0432\u043e\u0442 \u0438 500\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/80b\/128\/d71\/80b128d717fcfe36cdb4bf20a8b7b1ae.jpg\" width=\"1608\" height=\"997\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/80b\/128\/d71\/80b128d717fcfe36cdb4bf20a8b7b1ae.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/500\/854\/6b9\/5008546b9d374c5267ce583dbcf78dfd.jpg\" width=\"1341\" height=\"923\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/500\/854\/6b9\/5008546b9d374c5267ce583dbcf78dfd.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0436\u0430\u043d\u0433\u043e \u043a\u0430\u043a \u0431\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u0442: &#171;\u044d\u0439, \u0447\u0435\u043b, \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u043e\u043b\u044f, \u0442\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0448\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0447\u0438\u0441\u043b\u043e, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435&#8230;&#187;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/12b\/928\/dbb\/12b928dbb7271d7769fa59fcb2721ac3.jpg\" width=\"678\" height=\"452\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/12b\/928\/dbb\/12b928dbb7271d7769fa59fcb2721ac3.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<h4>Error reports<\/h4>\n<p>\u0411\u0435\u0437 \u0441\u0430\u0440\u043a\u0430\u0437\u043c\u0430, \u0438\u0434\u0435\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0430 email \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 &#8212; \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e! \u042d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0435\u0449\u0451 \u043d\u0435 \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0435\u043d. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430: \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u041d\u0435 \u0434\u0430\u0439 \u0431\u043e\u0433 \u0432\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0435\u0451 &#8212; \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u0430\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 \u043f\u0438\u0441\u044c\u043c\u043e \u043d\u0430 \u043f\u043e\u0447\u0442\u0443, \u0438 \u0441\u043a\u043e\u0440\u043e \u0432\u0430\u0448 \u044f\u0449\u0438\u043a \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u043f\u043e\u043c\u043e\u0439\u043a\u0443.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u0430\u0441 \u043f\u043e\u0440\u0430\u0434\u043e\u0432\u0430\u043b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0414\u0436\u0430\u043d\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e invalid host header &#8212; \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435  <code>header Host: xxx.com<\/code> \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u0434\u043e\u043c\u0435\u043d\u0443 \u0438\u0437 <code>ALLOWED_HOSTS<\/code> &#8212; \u0432\u044b\u0437\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 500. \u041b\u043e\u0433\u0438\u043a\u0430, \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u0442\u0430\u043a\u0430\u044f: \u0440\u0430\u0437 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0445\u0440\u0435\u043d \u0441 \u0433\u043e\u0440\u044b \u0443\u043a\u0430\u0437\u0430\u043b \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0442\u043e \u0432\u0430\u0448 \u0441\u0430\u0439\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043f\u0430\u0441\u0442\u044c, \u0430 \u0430\u0434\u043c\u0438\u043d\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u0438\u0439\u0442\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435. \u041d\u0435\u043f\u043b\u043e\u0445\u043e, \u0414\u0436\u0430\u043d\u0433\u043e!<\/p>\n<p>\u0412\u043e\u0442 \u043c\u043e\u044f \u043f\u043e\u0447\u0442\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/2d1\/8b7\/48d\/2d18b748ddf6767c6f94028aa0a2ff56.jpg\" width=\"1243\" height=\"627\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2d1\/8b7\/48d\/2d18b748ddf6767c6f94028aa0a2ff56.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<h3>Syndication framework (RSS \/ atom feeds)<\/h3>\n<p>\u041d\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439. \u041d\u0435 fingerprinting. \u041d\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \/ \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043d\u0435\u0442. <strong>\u0412\u0430\u043c \u043d\u0443\u0436\u0435\u043d <\/strong><a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/ref\/contrib\/syndication\/\" rel=\"noopener noreferrer nofollow\"><strong>RSS<\/strong><\/a><strong>!!<\/strong><\/p>\n<h3>Sessions<\/h3>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0446\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c?<\/p>\n<blockquote>\n<p>\u0412 \u0414\u0436\u0430\u043d\u0433\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0435\u0441\u0441\u0438\u0439, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 base64. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u044f\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.    &#8212; <a href=\"https:\/\/github.com\/jazzband\/django-user-sessions\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/jazzband\/django-user-sessions<\/a><\/p>\n<\/blockquote>\n<p>\u041d\u0443 \u0447\u043e, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c.<\/p>\n<p>\u0410 \u0435\u0449\u0451 \u0432 \u0441\u0435\u0441\u0441\u0438\u044f\u0445 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043d\u043e \u0432\u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445:<\/p>\n<pre><code class=\"python\"># Session is modified. request.session['foo'] = 'bar'  # Session is modified. del request.session['foo']  # Session is modified. request.session['foo'] = {}  # Gotcha: Session is NOT modified, because this alters # request.session['foo'] instead of request.session. request.session['foo']['bar'] = 'baz'<\/code><\/pre>\n<p>\u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0442\u0430\u043a, \u043d\u043e \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043b\u0438\u0431\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0451, \u043b\u0438\u0431\u043e \u043d\u0438\u043a\u0430\u043a, \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 gotcha. \u0421\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0430\u0440\u0435\u043d\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0438 \u044f\u0432\u043d\u043e\u0433\u043e \u00af_(\u30c4)_\/\u00af<\/p>\n<h3>Jazzband<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0443\u043b\u0435\u0442\u0435\u043b\u0438 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0443 \u0438 \u0432\u0434\u0440\u0443\u0433 \u043f\u043e \u043f\u0440\u0438\u043b\u0451\u0442\u0443 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438, \u0447\u0442\u043e \u0437\u0430\u0431\u044b\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u0447\u0435\u043c\u043e\u0434\u0430\u043d\u044b &#8212; \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u043e\u0441\u043b\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u0447\u0442\u043e\u0439. \u0412\u043e\u0442 <a href=\"https:\/\/jazzband.co\/projects\" rel=\"noopener noreferrer nofollow\">jazzband<\/a> &#8212; \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u0430\u043a\u043e\u0439 \u0447\u0435\u043c\u043e\u0434\u0430\u043d \u0441 \u0437\u0430\u0431\u044b\u0442\u044b\u043c\u0438 \u0432\u0435\u0449\u0430\u043c\u0438.<\/p>\n<p>\u0418 \u0432\u0435\u0449\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u0432\u044b \u043d\u0435 \u0432\u0437\u044f\u043b\u0438 \u0432 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u0442\u0440\u0443\u0441\u044b \u0438\u043b\u0438 \u0434\u0435\u043d\u044c\u0433\u0438:<\/p>\n<ul>\n<li>\n<p>django-constance<\/p>\n<\/li>\n<li>\n<p>django-redis<\/p>\n<\/li>\n<li>\n<p>django-auditlog<\/p>\n<\/li>\n<li>\n<p>django-robots<\/p>\n<\/li>\n<li>\n<p>django-model-utils<\/p>\n<\/li>\n<li>\n<p>django-pipeline<\/p>\n<\/li>\n<li>\n<p>sorl-thumbnail<\/p>\n<\/li>\n<li>\n<p>&#8230;<\/p>\n<\/li>\n<\/ul>\n<h2>\u0428\u0430\u0431\u043b\u043e\u043d\u044b (templates)<\/h2>\n<h3>Rocket science<\/h3>\n<p>\u042f \u0432\u0435\u0440\u044e, \u0447\u0442\u043e \u0431\u043e\u0433 \u0443\u0441\u0442\u0440\u043e\u0438\u043b \u0432\u0435\u043b\u0438\u043a\u0438\u0439 \u043f\u043e\u0442\u043e\u043f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0440\u043e\u0434\u044f\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u044b django \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u044e\u0442 Django templates, \u0438 \u0445\u043e\u0442\u0435\u043b \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c.<\/p>\n<p>\u041d\u0435 \u0432\u044b\u0448\u043b\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/3bc\/c0a\/d77\/3bcc0ad77f7aa3bbeafe7d17d121c298.jpg\" width=\"1400\" height=\"500\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3bc\/c0a\/d77\/3bcc0ad77f7aa3bbeafe7d17d121c298.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0448\u0451\u043b \u0441 php, \u0433\u0434\u0435 \u0431\u044b\u043b\u043e \u043d\u043e\u0440\u043c\u043e\u0439 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0411\u0414 \u043f\u0440\u044f\u043c\u043e \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0438 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0443\u043a\u0438, \u044f \u0431\u044b\u043b \u043f\u043e\u0440\u0430\u0436\u0451\u043d \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 MVT \u0432 Django &#8212; \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433! \u0418 \u0432\u0441\u0451 \u0431\u044b \u0442\u0443\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0432\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u044b&#8230; \u0415\u0441\u043b\u0438 \u0432 php \u0431\u044b\u043b\u0430 \u043e\u0434\u043d\u0430 \u043a\u0440\u0430\u0439\u043d\u043e\u0441\u0442\u044c &#8212; \u044f \u043c\u043e\u0433 \u0441\u0434\u0435\u043b\u0430\u0442\u044c <em>\u0432\u0441\u0451<\/em> \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 &#8212; \u0442\u043e \u0442\u0443\u0442 \u044f \u043c\u043e\u0433 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e: \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434 (\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432!), \u0438\u043b\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 (\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e 1 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442), \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u043b\u0438\u0442\u044c templatetag, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e >1 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 template filter \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442?<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440? \u041e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0430\u043c\u043e?<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0435\u0441\u043b\u0438 \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u0442\u043e \u0443\u0436\u0435 template tag?<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 inclusion tag, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u044f\u0432\u043d\u043e \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435? \u042f \u0432\u0435\u0434\u044c \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e \u043a\u043e\u0434. \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 \u0435\u0449\u0451 \u0448\u0430\u0431\u043b\u043e\u043d.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0447\u0435\u043c takes_context, \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u044f\u0432\u043d\u043e?<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0447\u0435\u043c \u0441\u043f\u043b\u0438\u0442\u0442\u0438\u0442\u044c \u043d\u0430 django.template.Node, \u0430 \u043f\u043e\u0442\u043e\u043c \u0434\u0436\u043e\u0439\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e? <\/p>\n<\/li>\n<li>\n<p>&#8230;\u0438 \u0442\u0430\u043a \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u0442\u044c template filters, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438 \u0435\u0441\u0442\u044c template tags, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; \u0445\u043c, \u0447\u0442\u043e-\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0442\u0430\u043a&#8230; \u041f\u0440\u0438\u0447\u0451\u043c \u0438\u0445 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e, \u0438 \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0438\u0441\u0430\u0442\u044c simpletag&#8230; \u0438\u043b\u0438 include_tag&#8230; \u0438\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c&#8230; \u041a\u043e\u0440\u043e\u0447\u0435, \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043c\u043e\u0433 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043b\u0430\u0437\u0438\u043b \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c.<\/p>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u044c: \u043d\u0443\u0436\u043d\u043e \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 (html \u0444\u0430\u0439\u043b\u0435) \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0447\u0451\u0440\u0442\u043e\u0432\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442! \u042d\u0442\u043e \u0436\u0435, \u043c\u0430\u0442\u044c \u0432\u0430\u0448\u0443, \u043d\u0435 \u0440\u043e\u043a\u0435\u0442 \u0441\u0430\u0435\u043d\u0441!<\/p>\n<p>\u0414\u0435\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u043a\u043e\u0433\u0434\u0430 \u044f \u043e\u0442\u043a\u0440\u044b\u043b \u0434\u043b\u044f \u0441\u0435\u0431\u044f <a href=\"http:\/\/jinja.palletsprojects.com\/\" rel=\"noopener noreferrer nofollow\">jinja2<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c python \u043a\u043e\u0434. \u041d\u0443\u0436\u043d\u0430 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f? \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439. \u041d\u0443\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0443\u0441\u043e\u043a html \u0432 \u0448\u0430\u0431\u043b\u043e\u043d? \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u044e\u0437\u0430\u0439\u0442\u0435 include \u0441 \u044f\u0432\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 <em>\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e<\/em>, \u043d\u043e, \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043d\u0430\u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<p>\u0418 \u0432\u044b, \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u0442\u0435: \u0440\u0430\u0437 jinja \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u0437\u043d\u0430\u0447\u0438\u0442, \u0437\u0430 \u044d\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0447\u0435\u043c-\u0442\u043e \u043f\u043b\u0430\u0442\u0438\u0442\u044c&#8230; \u041a\u0445\u043c, \u043e\u043d\u0438 \u0435\u0449\u0451 \u0438 <a href=\"https:\/\/www.google.com\/search?q=jinja%20vs%20django%20speed\" rel=\"noopener noreferrer nofollow\">\u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0434\u0436\u0430\u043d\u0433\u043e\u0432\u0441\u043a\u0438\u0445<\/a>.<\/p>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0440\u0435\u0448\u0435\u043d\u0430 &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0447\u0442\u043e \u0442\u0435\u0431\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f &#8212; \u043d\u043e \u043d\u0435 \u0442\u0443\u0442-\u0442\u043e \u0431\u044b\u043b\u043e, \u0432\u0435\u0434\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0442\u0430\u043c \u0441\u0442\u043e\u044f\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0443\u0431\u043b\u044e\u0434\u0441\u043a\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0414\u0436\u0430\u043d\u0433\u043e, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043d\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044f \u0431\u0443\u0434\u0443 \u0438\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c, \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0438\u0445 \u0438\u0437\u0443\u0447\u0430\u0442\u044c, \u0430 \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0443 \u043c\u0435\u043d\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0414\u0436\u0430\u043d\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445.<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0414\u0436\u0430\u043d\u0433\u043e!<\/p>\n<h3>Template dirs<\/h3>\n<p>\u0413\u0434\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u044b? \u041d\u0443, \u0441\u043c\u043e\u0442\u0440\u044f \u043a\u0430\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u041c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435. \u041c\u043e\u0433\u0443\u0442 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u044b\u0442\u044c \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u0430\u043f\u043a\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043a\u0430\u043a \u0431\u044b \u0441\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043c\u0435\u0433\u0430-\u043f\u0430\u043f\u043a\u0443. \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c <code>app1\/templates\/home.html<\/code> \u0438 <code>app2\/templates\/home.html<\/code>, \u0442\u043e \u0433\u043e\u0442\u043e\u0432\u044c\u0442\u0435\u0441\u044c \u043a \u0431\u043e\u044e \u0433\u043b\u0430\u0434\u0438\u0430\u0442\u043e\u0440\u043e\u0432: \u0432\u044b\u0436\u0438\u0432\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0439, \u0430 \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u0432\u0448\u0438\u0439 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d. \u041e\u0442\u0441\u044e\u0434\u0430 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 \u0445\u0430\u043a &#8212; \u043a\u0438\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0432 \u043f\u043e\u0434\u043f\u0430\u043f\u043a\u0438 \u0442\u0438\u043f\u0430 <code>app1\/templates\/app1\/home.html<\/code>. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a \u0441\u0435\u0431\u0435, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0438 \u0447\u0442\u043e \u0442\u0430\u043c \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 &#171;\u043c\u0435\u0433\u0430-\u043f\u0430\u043f\u043a\u0435&#187; \u043f\u043e\u0441\u043b\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c &#8212; \u0445\u0440\u0435\u043d \u0435\u0433\u043e \u0437\u043d\u0430\u0435\u0442.<\/p>\n<h3>Debugging<\/h3>\n<p>\u0412\u043e\u0442 \u0447\u0442\u043e <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/howto\/custom-template-tags\/#writing-custom-template-filters\" rel=\"noopener noreferrer nofollow\">\u043f\u0438\u0448\u0435\u0442 \u0414\u0436\u0430\u043d\u0433\u043e<\/a> \u043f\u0440\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u044b:<\/p>\n<blockquote>\n<p>Since the template language doesn\u2019t provide exception handling, any exception raised from a template filter will be exposed as a server error. Thus, filter functions should avoid raising exceptions if there is a reasonable fallback value to return. In case of input that represents a clear bug in a template, raising an exception may still be better than silent failure which hides the bug.<\/p>\n<\/blockquote>\n<p>\u0422\u0438\u043f\u0430, \u0435\u0441\u043b\u0438 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0444\u0438\u043b\u044c\u0442\u0440\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0441\u0432\u0430\u043b\u0438\u0442\u044c\u0441\u044f \u0432 Exception. \u041e\u043a\u0435\u0439, \u0414\u0436\u0430\u043d\u0433\u043e, \u0442\u044b \u0436\u0435 \u0442\u0430\u043a \u0438 \u0434\u0435\u043b\u0430\u0435\u0448\u044c, \u0434\u0430?<\/p>\n<pre><code class=\"python\">async def view(request):     return TemplateResponse(request, 'template.html',                              {'items': [1, 2, 3, 4, 5]})<\/code><\/pre>\n<pre><code class=\"xml\"># template.html {{ non_existent }}  # \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e) {{ items|add:\"2\" }}  # \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 {{ items|capfirst }}  # \u0432\u044b\u0432\u0435\u0434\u0435\u0442 [1, 2, 3, 4, 5] (\u043a\u0430\u043a \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0442\u0443\u0442 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u0430\u044f, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b \u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435) {{ items|date:\"D d M Y\" }}  # \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 {{ items|dictsort:\"name\" }}  # \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0432\u0435\u0434\u0435\u0442<\/code><\/pre>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u043e, \u0447\u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 <code>string_if_invalid = 'ERROR'<\/code>, \u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e <code>ERROR<\/code>. \u0414\u0435\u0431\u0430\u0433\u0433\u0438\u043d\u0433 \u0443\u0440\u043e\u0432\u043d\u044f &#171;\u0431\u043e\u0433&#187;!<\/p>\n<p>\u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0434\u0436\u0430\u043d\u0433\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0441\u043b\u0430\u0432\u043d\u0443\u044e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044e PHP: \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u043e\u0442\u044c \u0432\u043e \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0438 \u0445\u043e\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438 \u043d\u0435 \u0443\u043f\u0430\u0441\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 list \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 <code>|date<\/code>, <code>|dictsort<\/code> \u0438 \u043a\u0443\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e. \u0417\u0430\u0431\u0430\u0432\u043d\u043e, \u0447\u0442\u043e <code>capfirst<\/code> \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u0410 \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u0438 \u043a \u043e\u0448\u0438\u0431\u043a\u0430\u043c? \u041d\u0443, \u043a\u0430\u043a <code>jinja2.StrictUndefined<\/code>, <a href=\"https:\/\/jinja.palletsprojects.com\/en\/3.0.x\/api\/#jinja2.StrictUndefined\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/a>.<\/p>\n<p>\u041e\u043a\u0435\u0439, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043d\u0435 \u043f\u0430\u0434\u0430\u044e\u0442 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u041a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c? \u0418\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 &#8212; \u043d\u0438\u043a\u0430\u043a. \u0412\u0435\u0440\u043d\u0435\u0435, \u0435\u0441\u0442\u044c <code>{% debug %}<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u0432\u0441\u0451, \u0447\u0442\u043e \u0437\u043d\u0430\u0435\u0442 \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u044b \u0443\u0436 \u0441\u0430\u043c\u0438. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043b\u044e\u0434\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0432\u0441\u044f\u043a\u043e\u0435 \u0440\u0430\u0437\u043d\u043e\u0435, \u0442\u043e\u0442 \u0436\u0435 pycharm <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/part-2-debugging-django-templates.html\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0431\u0440\u0435\u0439\u043a\u043f\u043e\u0438\u043d\u0442\u044b \u043f\u0440\u044f\u043c\u043e \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445<\/a>, \u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0438\u0434\u0451\u0442 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441 \u0434\u0436\u0430\u043d\u0433\u043e.<\/p>\n<p>\u0412\u043e\u0442 \u0443 \u043c\u0435\u043d\u044f \u0443\u043f\u0430\u043b \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u0436\u0430\u043d\u0433\u043e-\u0430\u0434\u043c\u0438\u043d\u043a\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u044f \u0432\u043c\u0435\u0441\u0442\u043e <code>str<\/code> \u0432\u0435\u0440\u043d\u0443\u043b <code>uuid4<\/code> \u0442\u0438\u043f. \u0414\u0436\u0430\u043d\u0433\u043e \u043b\u044e\u0431\u0435\u0437\u043d\u043e \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u0442: \u0447\u0443\u0432\u0430\u043a, \u0443 \u0442\u0435\u0431\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0435 inline-\u0444\u043e\u0440\u043c\u044b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/fc2\/d72\/d7d\/fc2d72d7dbfe749d9d4ba2add65b8e3a.jpg\" alt=\"`\" title=\"`\" width=\"1582\" height=\"1000\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fc2\/d72\/d7d\/fc2d72d7dbfe749d9d4ba2add65b8e3a.jpg\" data-blurred=\"true\"\/><figcaption>`<\/figcaption><\/figure>\n<p>\u0427\u0442\u043e? \u0413\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0448\u0438\u0431\u043a\u0430? \u041d\u0443 \u0432\u043e\u0442 \u0442\u0443\u0442, \u0441\u043c\u043e\u0442\u0440\u0438, \u044f <em>\u0447\u0442\u043e-\u0442\u043e<\/em> \u043f\u044b\u0442\u0430\u044e\u0441\u044c \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043f\u0430\u0434\u0430\u044e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/85d\/ef8\/56f\/85def856fc056c8bc86796f5fd51e701.jpg\" width=\"1427\" height=\"922\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/85d\/ef8\/56f\/85def856fc056c8bc86796f5fd51e701.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/255\/02e\/9e6\/25502e9e6e5d9df7992098d05977a7ff.jpg\" width=\"678\" height=\"452\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/255\/02e\/9e6\/25502e9e6e5d9df7992098d05977a7ff.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0438\u0436\u0435 \u043e\u0434\u043d\u043e \u0438\u0437 \u043c\u043e\u0438\u0445 \u043b\u044e\u0431\u0438\u043c\u044b\u0445: &#171;\u0427\u0443\u0432\u0430\u043a, \u0442\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0448\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c <code>Decimal<\/code> \u0438 <code>decimal.Decimal<\/code>. \u0413\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u044d\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u0432 \u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u044f\u0445 \u043c\u043e\u0434\u0435\u043b\u0438? \u041d\u0443 \u043a\u0430\u043a, \u0410\u043b\u0435\u043a\u0441, \u0442\u044b \u0434\u0443\u0440\u0430\u043a \u0447\u0442\u043e \u043b\u0438? \u0412\u043e\u0442 \u0442\u0443\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u0432\u0438\u0434\u0438\u0448\u044c: <code>return a &lt; b<\/code>. \u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u0430\u043c.&#187;<\/p>\n<pre><code>Internal Server Error: \/admin\/shop\/order\/1019884\/change\/  TypeError at \/admin\/shop\/order\/1019884\/change\/ '&lt;' not supported between instances of 'decimal.Decimal' and 'Decimal'<\/code><\/pre>\n<pre><code>Traceback (most recent call last):  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/core\/handlers\/exception.py\", line 47, in inner  response = get_response(request)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/core\/handlers\/base.py\", line 181, in _get_response  response = wrapped_callback(request, *callback_args, **callback_kwargs)  File \"\/usr\/local\/lib\/python3.10\/contextlib.py\", line 79, in inner  return func(*args, **kwds)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/contrib\/admin\/options.py\", line 616, in wrapper  return self.admin_site.admin_view(view)(*args, **kwargs)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/utils\/decorators.py\", line 130, in _wrapped_view  response = view_func(request, *args, **kwargs)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/views\/decorators\/cache.py\", line 44, in _wrapped_view_func  response = view_func(request, *args, **kwargs)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/contrib\/admin\/sites.py\", line 232, in inner  return view(request, *args, **kwargs)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/contrib\/admin\/options.py\", line 1660, in change_view  return self.changeform_view(request, object_id, form_url, extra_context)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/utils\/decorators.py\", line 43, in _wrapper  return bound_method(*args, **kwargs)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/utils\/decorators.py\", line 130, in _wrapped_view  response = view_func(request, *args, **kwargs)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/contrib\/admin\/options.py\", line 1540, in changeform_view  return self._changeform_view(request, object_id, form_url, extra_context)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/contrib\/admin\/options.py\", line 1585, in _changeform_view  if all_valid(formsets) and form_validated:  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/forms\/formsets.py\", line 496, in all_valid  return all([formset.is_valid() for formset in formsets])  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/forms\/formsets.py\", line 496, in &lt;listcomp>  return all([formset.is_valid() for formset in formsets])  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/forms\/formsets.py\", line 321, in is_valid  self.errors  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/forms\/formsets.py\", line 304, in errors  self.full_clean()  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/forms\/formsets.py\", line 361, in full_clean  form_errors = form.errors  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/forms\/forms.py\", line 170, in errors  self.full_clean()  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/forms\/forms.py\", line 374, in full_clean  self._post_clean()  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/forms\/models.py\", line 413, in _post_clean  self.instance.full_clean(exclude=exclude, validate_unique=False)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/db\/models\/base.py\", line 1216, in full_clean  self.clean_fields(exclude=exclude)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/db\/models\/base.py\", line 1258, in clean_fields  setattr(self, f.attname, f.clean(raw_value, self))  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/db\/models\/fields\/__init__.py\", line 671, in clean  self.run_validators(value)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/db\/models\/fields\/__init__.py\", line 623, in run_validators  v(value)  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/core\/validators.py\", line 358, in __call__  if self.compare(cleaned, limit_value):  File \"\/usr\/local\/lib\/python3.10\/site-packages\/django\/core\/validators.py\", line 392, in compare  return a &lt; b  Exception Type: TypeError at \/inside\/shop\/order\/1019884\/change\/ Exception Value: '&lt;' not supported between instances of 'decimal.Decimal' and 'Decimal'<\/code><\/pre>\n<h2>\u0410\u0434\u043c\u0438\u043d\u043a\u0430<\/h2>\n<p>\u0410\u0434\u043c\u0438\u043d\u043a\u0430 &#8212; \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u043a\u0438\u043b\u043b\u0435\u0440-\u0444\u0438\u0447. Forward declaration: \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043d\u0430\u043f\u0438\u0448\u0443, \u0447\u0442\u043e \u0441 \u0414\u0436\u0430\u043d\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430 5 \u043c\u0438\u043d\u0443\u0442 \u0443\u043b\u0435\u0442\u0435\u0442\u044c \u0432 \u043a\u043e\u0441\u043c\u043e\u0441 &#8212; \u0430 \u0442\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044e, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0449\u0451 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u043f\u0430\u043d\u0435\u043b\u044c \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u043c. \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e&#8230;.<\/p>\n<h3>\u041a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>\u041a\u0443\u0447\u0430 \u0432\u0441\u0435\u0433\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c: \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u0433\u0434\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c, \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. \u041d\u043e \u043d\u0438 \u0448\u0430\u0433\u0443 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443.<\/p>\n<h4>\u041a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c<\/h4>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0444\u0430\u0439\u043b\u0430 (\u0434\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435\u043c \u043d\u0443\u0436\u043d\u0430 \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e).<\/p>\n<p>\u041f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d:<\/p>\n<pre><code class=\"xml\">{% extends \"admin\/change_list.html\" %}  {% block object-tools %}   &lt;ul class=\"object-tools\">     {% block object-tools-items %}       {% if has_add_permission %}         &lt;li>             &lt;a href=\"{{ import_url }}\" class=\"addlink\">Import&lt;\/a>         &lt;\/li>         {{ block.super }}       {% endif %}     {% endblock %}   &lt;\/ul> {% endblock %}<\/code><\/pre>\n<p>\u0412 ModelAdmin \u043a\u043b\u0430\u0441\u0441 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0435 <code>get_urls<\/code>:<\/p>\n<pre><code class=\"python\">class SomeAdmin(admin.ModelAdmin):     def get_urls(self) -> List[str]:         return [             path(                 'import\/',                 self.admin_site.admin_view(     self.import_view.as_view(     success_url=reverse_lazy(f'admin:app_model_changelist') ) ),                 name='import',             ),             *super().get_urls(),         ]<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0441\u0432\u043e\u0439 View, \u0432 \u043d\u0451\u043c \u043f\u0438\u0448\u0435\u0442\u0435 \u043b\u043e\u0433\u0438\u043a\u0443 \u043a\u043d\u043e\u043f\u043a\u0438:<\/p>\n<pre><code class=\"python\">class ImportView(FormView):     form_class = ImportForm     template_name = 'admin\/import.html'      def form_valid(self, form):         # ...         return super().form_valid(form)<\/code><\/pre>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u0443 \u0432\u0430\u0441 \u0432\u0440\u043e\u0434\u0435 \u0435\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0430, \u043d\u043e \u043a\u043e\u0434 \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u043d \u0442\u0443\u0442 \u0438 \u0442\u0430\u043c, \u0432\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0430\u0434\u043c\u0438\u043d \u0448\u0430\u0431\u043b\u043e\u043d, \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 view, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0437\u0430\u0431\u044b\u043b\u0438 \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0432 <code>admin_view<\/code>&#8230; \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u044d\u0442\u043e \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u043b\u0435\u0433\u043a\u043e \u0432 django \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 admin actions &#8212; \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u0435\u0451 \u0432 <code>actions = [...]<\/code>, \u0438 \u0434\u0436\u0430\u043d\u0433\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0430\u043c! \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a \u043d\u0430 \u0442.\u043d. change list \u0438 change form \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0438?<\/p>\n<h4>Nested inlines<\/h4>\n<p>\u0415\u0441\u0442\u044c inline, \u043d\u043e \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u043d\u0443 \u0442\u0430\u043c inline \u0432 inline? \u0412 \u044d\u0442\u043e \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043d\u043e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f &#171;\u0434\u043e\u043c -> \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0430 -> \u0436\u0438\u043b\u044c\u0446\u044b&#187;, \u0442\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0445\u043e\u0442\u0435\u0442\u044c \u043f\u0440\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u043e\u043c\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0443 \u0438 <em>\u0441\u0440\u0430\u0437\u0443<\/em> \u0436\u0438\u043b\u044c\u0446\u043e\u0432 \u0432 \u043d\u0435\u0439. \u041d\u0430\u0447\u0438\u043d\u0430\u0439\u0442\u0435 \u043e\u0442\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0414\u0436\u0430\u043d\u0433\u043e, \u043e\u043d\u0438 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b.<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/915\/a9c\/d74\/915a9cd74b22a201b407d21f2be103a3.jpg\" width=\"188\" height=\"193\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/915\/a9c\/d74\/915a9cd74b22a201b407d21f2be103a3.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0434\u0436\u0430\u043d\u0433\u043e \u0435\u0441\u0442\u044c <code>show_change_link<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u0447\u0442\u043e \u0443\u0431\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0441\u044c UX.<\/p>\n<p>\u0415\u0441\u0442\u044c <a href=\"https:\/\/github.com\/s-block\/django-nested-inline\" rel=\"noopener noreferrer nofollow\">django-nested-inline<\/a>, \u043e\u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0432\u0451\u0437\u0434 \u0438 issues \u043c\u0435\u043d\u044f \u043d\u0430\u0441\u0442\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u0435\u0442, \u0438 \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c \u043a\u043e\u0448\u043c\u0430\u0440\u043e\u043c.<\/p>\n<p>\u0410\u0445 \u0434\u0430, <a class=\"mention\" href=\"\/users\/danilovmy\">@danilovmy<\/a> \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c inline-in-inline 4 \u0441\u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043d\u0430 \u043f\u0438\u0442\u043e\u043d\u0435, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e-\u0442\u043e \u043f\u043e\u0436\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u0436\u0430\u043d\u0433\u043e\u0432\u0441\u043a\u043e\u043c javascript \u0438 \u0432\u0441\u0451 \u0442\u0430\u043c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/ac8\/51e\/5be\/ac851e5be77178acad5d19a698b4d6d2.jpg\" width=\"668\" height=\"100\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ac8\/51e\/5be\/ac851e5be77178acad5d19a698b4d6d2.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0435\u0442, \u0441\u043f\u0430\u0441\u0438\u0431\u043e, \u043f\u0443\u0441\u0442\u044c \u0447\u0438\u043d\u044f\u0442 \u0442\u0435, \u043a\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/post\/550088\/\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u0431\u0440\u0430\u043b <\/a><code>[object Object]<\/code>.<\/p>\n<h3>Optimistic lock<\/h3>\n<p>\u0415\u0433\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u0441\u043f\u043e\u0440\u0442\u0438\u0442 \u0432\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435. \u042f <a href=\"https:\/\/habr.com\/ru\/post\/194974\/\" rel=\"noopener noreferrer nofollow\">\u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e \u044d\u0442\u043e<\/a>, \u043d\u043e \u0432\u043a\u0440\u0430\u0442\u0446\u0435: \u043d\u0438\u0447\u0442\u043e \u043d\u0435 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0430\u0434\u043c\u0438\u043d \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443 \u043e\u0442\u043a\u0440\u043e\u044e\u0442 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b, \u0438 \u043f\u043e\u0431\u0435\u0434\u044f\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043a\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0436\u0435 \u0434\u0440\u0443\u0433\u043e\u0433\u043e.<\/p>\n<p>\u0412\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0442\u043e\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435.<\/p>\n<h3>Object history<\/h3>\n<p>\u0414\u0436\u0430\u043d\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u0443\u044e \u0444\u0438\u0447\u0443: \u043e\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0432\u0441\u0435\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0425\u0435\u0445, \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u043f\u043e\u0432\u0435\u0440\u0438\u043b\u0438, \u0447\u0442\u043e \u0432\u0441\u0451 \u0442\u0430\u043a \u0445\u043e\u0440\u043e\u0448\u043e? \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442, <em>\u043a\u0442\u043e<\/em> \u0438 <em>\u043a\u043e\u0433\u0434\u0430<\/em> \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0443\u0437\u043d\u0430\u0442\u044c, <em>\u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e<\/em> \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c &#8212; \u0434\u0430 \u043f\u043e\u0448\u043b\u0438 \u0432\u044b! \u0417\u0430\u0442\u043e \u044d\u0442\u0430 \u0444\u0438\u0447\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041d\u043e \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u0430\u043c \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0442\u043e \u043d\u0435 \u0432\u043e\u043b\u043d\u0443\u0439\u0442\u0435\u0441\u044c: \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0448\u043b\u0438 <em>\u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0430\u0434\u043c\u0438\u043d\u043a\u0443<\/em>, \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0432 \u044d\u0442\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043d\u0435 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/f40\/379\/aef\/f40379aef8756ec4c26ddd573d6440e9.jpg\" width=\"1369\" height=\"210\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f40\/379\/aef\/f40379aef8756ec4c26ddd573d6440e9.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0449\u0451 \u0440\u0430\u0437: <strong>\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438<\/strong> \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f <strong>\u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f<\/strong> \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u0438 \u0442\u043e <strong>\u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430<\/strong>. \u0411\u0440\u0430\u0432\u043e!<\/p>\n<h3>Dashboard<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0441 \u043d\u0430\u0448\u0435\u0439 \u043f\u043b\u0430\u043d\u0435\u0442\u044b, \u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0435 \u0432\u0441\u0451 \u043a\u0430\u043a-\u0442\u043e \u0432 \u0441\u0432\u043e\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u0435. \u041d\u0443 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 &#171;\u043c\u0430\u0433\u0430\u0437\u0438\u043d -> \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b&#187;. \u0418\u043b\u0438 \u0442\u0430\u043c &#171;\u0434\u043e\u043c -> \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0430 -> \u0436\u0438\u043b\u044c\u0446\u044b&#187;. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u0414\u0436\u0430\u043d\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 \u0443\u043b\u0438\u0446\u0443, \u0443 \u043d\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u043b\u0435\u0436\u0430\u0442 \u0440\u044f\u0434\u043e\u043c \u0441 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u043e\u043c, \u0430 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432\u043d\u0435 \u0434\u043e\u043c\u0430, \u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0434\u044f\u0442 \u0436\u0438\u043b\u044c\u0446\u044b. \u0418\u043d\u0430\u0447\u0435 \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0430\u0434\u043c\u0438\u043d\u043a\u0430 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0438 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0432\u0430\u043b\u0435\u043d\u043e \u0432 \u043e\u0434\u043d\u0443 \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043a\u0443\u0447\u0443 (\u0432\u0440\u0443, \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e <em>\u043f\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0443<\/em>, \u0445\u0430-\u0445\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u044b &#171;\u0434\u043e\u043c&#187;, &#171;\u0436\u0438\u043b\u044c\u0446\u044b&#187;, &#171;\u043a\u0432\u0430\u0440\u0442\u0438\u0440\u044b&#187; &#8212; \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/01e\/d7f\/026\/01ed7f02624148e6333fff18941de7b4.jpg\" alt=\"\u0421\u043c\u0435\u0448\u0430\u043b\u0438\u0441\u044c \u0432 \u043a\u0443\u0447\u0443 \u043a\u043e\u043d\u0438, \u043b\u044e\u0434\u0438, \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438, \u043a\u043b\u0438\u0435\u043d\u0442\u044b, \u0435\u043c\u0430\u0439\u043b\u044b...\" title=\"\u0421\u043c\u0435\u0448\u0430\u043b\u0438\u0441\u044c \u0432 \u043a\u0443\u0447\u0443 \u043a\u043e\u043d\u0438, \u043b\u044e\u0434\u0438, \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438, \u043a\u043b\u0438\u0435\u043d\u0442\u044b, \u0435\u043c\u0430\u0439\u043b\u044b...\" width=\"796\" height=\"217\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/01e\/d7f\/026\/01ed7f02624148e6333fff18941de7b4.jpg\" data-blurred=\"true\"\/><figcaption>\u0421\u043c\u0435\u0448\u0430\u043b\u0438\u0441\u044c \u0432 \u043a\u0443\u0447\u0443 \u043a\u043e\u043d\u0438, \u043b\u044e\u0434\u0438, \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438, \u043a\u043b\u0438\u0435\u043d\u0442\u044b, \u0435\u043c\u0430\u0439\u043b\u044b&#8230;<\/figcaption><\/figure>\n<h3>Select2<\/h3>\n<p>\u042d\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044f\u0435\u0442 UI \u0434\u043b\u044f \u0432\u0441\u044f\u043a\u0438\u0445 <code>&lt;select><\/code> \u043f\u043e\u043b\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u0435\u0447\u0430\u0442\u0438 \u043f\u0435\u0440\u0432\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0417\u0430\u0447\u0435\u043c? \u041d\u0443 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 10 000 \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u0438 \u0433\u0434\u0435-\u0442\u043e, \u0445\u043e\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0442\u043e\u0432\u0430\u0440, \u0442\u043e \u0431\u0435\u0437 select2 \u044d\u0442\u043e \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u0435 \u0441 10 000 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438, \u0438 \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u0430\u0448\u043d\u043e \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442\u044c. \u0412\u044b \u043d\u0435 \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u0435, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0432 \u0414\u0436\u0430\u043d\u0433\u043e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0433\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u0440\u0438\u044f\u0442\u043d\u043e \u043f\u043e\u043b\u0438\u0441\u0442\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 10 000 \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0445\u043e\u043b\u043e\u0434\u043d\u044b\u043c\u0438 \u043e\u0441\u0435\u043d\u043d\u0438\u043c\u0438 \u0432\u0435\u0447\u0435\u0440\u0430\u043c\u0438&#8230;<\/p>\n<h2>ORM<\/h2>\n<p>\u041c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 ORM, \u043a\u043e\u0433\u0434\u0430 sqlalchemy \u0435\u0449\u0451 \u043d\u0435 \u0431\u044b\u043b \u0442\u0430\u043a \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d, \u0438\u043b\u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d, \u0438\u043b\u0438 \u0435\u0449\u0451 <a href=\"https:\/\/lurkmore.to\/%D0%A4%D0%B0%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BE%D0%BA\" rel=\"noopener noreferrer nofollow\">\u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435<\/a>. \u0410 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0440\u043e\u0433\u0438 \u043d\u0430\u0437\u0430\u0434.<\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u0430 ORM<\/h3>\n<p>\u041d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e ORM &#8212; \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044c SQL, \u0432\u0435\u0434\u044c ORM \u0441\u0430\u043c \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u0442 \u0432\u0430\u0448 python \u043a\u043e\u0434 \u0432 SQL-\u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>\u042f \u0432\u044b\u0440\u043e\u0441 \u043d\u0430 \u044d\u0442\u043e\u043c. \u0417\u0430 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f, \u043a\u0430\u043a \u044f \u043f\u0438\u0448\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 django, \u044f \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u043b \u0447\u0438\u0441\u0442\u044b\u0439 SQL <em>\u043d\u0438 \u0440\u0430\u0437\u0443<\/em> \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438 \u0435\u0441\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0445\u0440\u0435\u043d\u044c. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u0430\u043a \u044f \u0432\u0441\u0442\u0435\u0447\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e SQL, \u044f \u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0441\u0435\u0431\u044f \u043d\u0435 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0442\u0430\u0440\u0435\u043b\u043a\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0414\u0436\u0430\u043d\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u0430\u043b\u0451\u043a \u043e\u0442 SQL.<\/p>\n<p>\u041d\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>select_related<\/code> \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 <code>JOIN<\/code>. \u0410 <code>prefetch_related<\/code> \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442. \u041d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 django ORM \u0432\u044b\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 SQL, \u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u044f\u043a\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u0442\u0438\u043f\u0430 <code>OuterRef<\/code>, <code>F<\/code>, <code>Q<\/code>, \u0438 \u0438\u0436\u0435 \u0441 \u043d\u0438\u043c\u0438. <code>GROUP BY<\/code> <a href=\"https:\/\/stackoverflow.com\/questions\/629551\/how-to-query-as-group-by-in-django\" rel=\"noopener noreferrer nofollow\">\u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d<\/a>.<\/p>\n<p>\u041c\u043e\u0451 \u043b\u0438\u0447\u043d\u043e\u0435 \u043c\u043d\u0435\u043d\u0438\u0435: ORM \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0411\u0414 (\u043f\u043e\u0433\u043e\u0434\u0438\u0442\u0435, \u0432\u0435\u0434\u044c \u044d\u0442\u043e \u0442\u0430\u043a \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f!), \u0430 \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u044f\u0437\u044b\u043a SQL \u0441\u0432\u043e\u0438\u043c (\u043d\u0435 \u043e\u0447\u0435\u043d\u044c-\u0442\u043e \u0438\u0437\u044f\u0449\u043d\u044b\u043c) DSL.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u043e \u0438\u0437\u044f\u0449\u043d\u043e\u0441\u0442\u0438&#8230;<\/p>\n<h3>.filter().filter() that span relations<\/h3>\n<p>\u042d\u0442\u043e \u043c\u043d\u0435 \u0441\u043d\u0435\u0441\u043b\u043e \u043c\u043e\u0437\u0433, \u043a\u043e\u0433\u0434\u0430 \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b. \u0421\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u0440\u0443\u043a\u0430\u043c\u0438:<\/p>\n<pre><code class=\"python\">Blog.objects.filter(id__gt=5, id__lt=10)<\/code><\/pre>\n<p>^&#8212; \u042d\u0442\u043e \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u0431\u043b\u043e\u0433\u0438 \u0441 5 &lt; ID &lt; 10.<\/p>\n<pre><code class=\"python\">Blog.objects.filter(id__gt=5).filter(id__lt=10)<\/code><\/pre>\n<p>^&#8212; \u042d\u0442\u043e \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435. \u0414\u0435\u043b\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440, \u043f\u043e\u0442\u043e\u043c &#171;\u0443\u0441\u0438\u043b\u044f\u0435\u043c&#187; \u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043d\u0451\u043c \u0442\u043e \u0436\u0435, \u043d\u043e \u0441 relations:<\/p>\n<pre><code class=\"python\">Blog.objects.filter(entry__headline__contains='Lennon', entry__pub_date__year=2008)<\/code><\/pre>\n<p>^&#8212; \u042d\u0442\u043e \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u0431\u043b\u043e\u0433\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c <code>Entry<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 <code>Lennon<\/code> <strong>\u0438<\/strong> \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 2008. \u041b\u043e\u0433\u0438\u0447\u043d\u043e.<\/p>\n<pre><code class=\"python\">Blog.objects.filter(entry__headline__contains='Lennon').filter(entry__pub_date__year=2008)<\/code><\/pre>\n<p>^&#8212; <s>\u042d\u0442\u043e \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435<\/s> \u0414\u0430 \u0445\u0440\u0435\u043d \u0442\u0430\u043c! \u042d\u0442\u043e \u0432\u0435\u0440\u043d\u0451\u0442 \u0431\u043b\u043e\u0433\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c <code>Entry<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 <code>Lennon<\/code>, <strong>\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c<\/strong> \u0435\u0441\u0442\u044c <code>Entry<\/code> (\u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435), \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 2008.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u044f \u0432\u0438\u0436\u0443 \u043b\u043e\u0433\u0438\u043a\u0443 &#8212; \u043a\u0430\u0436\u0434\u044b\u0439 <code>filter(...)<\/code> \u0438\u043c\u0435\u0435\u0442 \u043a\u0430\u043a \u0431\u044b \u0441\u0432\u043e\u0439 &#171;scope&#187;, \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e \u0432\u0442\u043e\u0440\u043e\u043c. \u041e\u043a\u0435\u0439, \u044f \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043b.<\/p>\n<p>\u0421 <code>exclude()<\/code> \u0432\u0435\u0434\u044c \u0442\u0430\u043a \u0436\u0435?.. \u0425\u0430-\u0445\u0430!<\/p>\n<pre><code class=\"python\">Blog.objects.exclude(     entry__headline__contains='Lennon',     entry__pub_date__year=2008, )<\/code><\/pre>\n<p>^&#8212; \u042d\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442 \u0431\u043b\u043e\u0433\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c <code>Entry<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 <code>Lennon<\/code>, <strong>\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c<\/strong> \u0435\u0441\u0442\u044c <code>Entry<\/code> (\u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435), \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 2008. \u0422\u043e \u0435\u0441\u0442\u044c <code>exclude()<\/code> \u043e\u0434\u0438\u043d, \u043d\u043e &#171;scope&#187; \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435. \u0410\u0430\u0430\u0430\u0430!&#8230;..<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0435\u0434\u0438\u043d\u044b\u0439 &#171;scope&#187;, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <code>filter()<\/code> \u0432 <code>exclude()<\/code>:<\/p>\n<pre><code class=\"python\">Blog.objects.exclude(     entry__in=Entry.objects.filter(         headline__contains='Lennon',         pub_date__year=2008,     ), )<\/code><\/pre>\n<p>^&#8212; \u042d\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442 \u0431\u043b\u043e\u0433\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c <code>Entry<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 <code>Lennon<\/code> <strong>\u0438<\/strong> \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 2008.<\/p>\n<p>\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/topics\/db\/queries\/#spanning-multi-valued-relationships\" rel=\"noopener noreferrer nofollow\">\u0445\u0432\u0430\u0442\u0438\u0442<\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/d7c\/6be\/9af\/d7c6be9afff899c353ff2de28ef1b00d.jpg\" width=\"1280\" height=\"536\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d7c\/6be\/9af\/d7c6be9afff899c353ff2de28ef1b00d.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u041c\u043e\u0434\u0435\u043b\u0438<\/h3>\n<p>\u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043f\u043e\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043e\u0437\u0432\u0443\u0447\u0443 \u0442\u0430\u043a: \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432 \u043c\u043e\u0434\u0435\u043b\u0438, \u0430 \u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c? \u0415\u0441\u0442\u044c \u043b\u0430\u0433\u0435\u0440\u044c \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0411\u0414, \u0430 \u0432\u0441\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0436\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0415\u0441\u043b\u0438 \u0430\u0434\u0435\u043f\u0442\u044b fat models, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0432\u0441\u0451 \u0441\u0442\u0430\u0440\u0430\u044e\u0442\u0441\u044f \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043c\u043e\u0434\u0435\u043b\u0438. \u0415\u0441\u0442\u044c \u043b\u044e\u0434\u0438 \u0441 \u043d\u0435\u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0432\u0437\u0433\u043b\u044f\u0434\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0438\u0448\u0443\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443 \u0432\u043e views.<\/p>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 &#171;\u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432 \u043c\u043e\u0434\u0435\u043b\u0438&#187; \u0414\u0436\u0430\u043d\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 &#171;\u0440\u0435\u0448\u0430\u0439\u0442\u0435 \u0441\u0430\u043c\u0438&#187;, \u0442\u043e \u0432\u043e\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 &#171;\u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432 \u043f\u043e\u043b\u044f\u0445 \u043c\u043e\u0434\u0435\u043b\u0438&#187; \u0414\u0436\u0430\u043d\u0433\u043e \u0443\u0436\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u043b \u0437\u0430 \u0432\u0430\u0441, \u0438 \u043e\u0442\u0432\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439.<\/p>\n<p>\u041d\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043f\u043e\u043b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>blank=True<\/code>, \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432\u0441\u044f\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u043e\u0447\u043a\u0438 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u043f\u0443\u0441\u0442\u044b\u043c. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430, \u043d\u0430 \u044d\u0442\u043e\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043f\u043b\u0435\u0432\u0430\u0442\u044c. \u0422\u043e \u0436\u0435 \u043f\u0440\u043e <code>editable<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u044b \u043f\u0438\u0448\u0438\u0442\u0435, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0444\u043e\u0440\u043c\u0430. \u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u0440\u043e\u0434\u0435 \u0435\u0441\u0442\u044c, \u043d\u043e \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u044d\u0442\u043e \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e.<\/p>\n<p><code>Choices<\/code> &#8212; \u0442\u0430 \u0436\u0435 \u0442\u0435\u043c\u0430: \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435, \u043a\u0430\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u043b\u0435, \u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0434\u0451\u0442 \u043d\u0430 \u044d\u0442\u043e \u0431\u043e\u043b\u0442. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0444\u0438\u0448\u043a\u0430 \u0434\u043b\u044f \u0444\u043e\u0440\u043c.<\/p>\n<p><code>Unique<\/code> &#8212; \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u043e\u043b\u044f &#8212; \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u0432 \u043f\u043e\u043b\u0435, \u0438 \u0432 <code>Meta<\/code> (\u043d\u043e \u0432 meta \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0430 \u0432 \u043f\u043e\u043b\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435). \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0438 \u0441 <code>db_index=True<\/code>.<\/p>\n<p>\u0423 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0435\u0441\u0442\u044c <code>max_length<\/code>, \u043d\u043e \u0411\u0414 \u043f\u043b\u0435\u0432\u0430\u0442\u044c:<\/p>\n<blockquote>\n<p>If you specify a <code>max_length<\/code> attribute, it will be reflected in the <code>Textarea<\/code> widget of the auto-generated form field. However it is not enforced at the model or database level. Use a <code>CharField<\/code> for that.<\/p>\n<\/blockquote>\n<h3>Dynamic choices<\/h3>\n<p>\u041b\u0430\u0434\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0436 \u0438\u0433\u0440\u0430\u0435\u043c \u0432\u043e \u0432\u0441\u044f\u043a\u0438\u0435 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u044b \u0438 choices, \u0442\u043e, \u0440\u0430\u0437 \u044d\u0442\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0438\u0442\u043e\u043d\u0430, \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0433\u0438\u0431\u043a\u043e? \u041d\u0443 \u0442\u0430\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u043c\u043e\u0433\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u043e\u0434, \u0447\u0442\u043e\u0431\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u043b\u0435 \u0437\u0430\u0432\u0438\u0441\u0435\u043b\u0438 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e?<\/p>\n<p>\u042d\u044d&#8230; \u041d\u0435\u0442. Choices \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b. <code>ForeignKey.limit_choices_to<\/code> <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/ref\/models\/fields\/#django.db.models.ForeignKey.limit_choices_to\" rel=\"noopener noreferrer nofollow\">\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/a>, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043b\u044f\u043c \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442.<\/p>\n<h3>AUTH_USER_MODEL<\/h3>\n<p>\u0412 \u0414\u0436\u0430\u043d\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0435\u0440\u0435\u0432\u044f\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 &#8212; User. \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u044e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>AUTH_USER_MODEL<\/code>, \u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u043d\u043e: \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435. \u0415\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u0437\u0436\u0435, \u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0431\u044b\u043b\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 auth_user, \u0430 \u043d\u043e\u0432\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432 yourapp_user, \u0438 \u0414\u0436\u0430\u043d\u0433\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0435\u0440\u0435\u0432\u0430\u0440\u0438\u0432\u0430\u0435\u0442.<\/p>\n<p>\u041a\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u043e\u0447\u0435\u043c\u0443, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 User \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 username, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u043d\u0435 \u0442\u0430\u043a-\u0442\u043e \u0438 \u043d\u0443\u0436\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c email. \u0417\u0430\u0442\u043e \u043e\u043d \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0435\u043b\u0435\u0444\u043e\u043d, \u0438 \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e, \u0442\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<p>\u041a\u043e\u0440\u043e\u0447\u0435, \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 django.contrib.auth &#8212; \u043f\u043b\u043e\u0445\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432 \u0434\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u043e\u0439 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435 \u0430\u0443\u043a\u043d\u0435\u0442\u0441\u044f, \u0432\u0435\u0434\u044c \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0435\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h3>Content Types<\/h3>\n<p>\u042d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0435 django-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432 \u0431\u0430\u0437\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0432\u0430\u0448\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u0427\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Generic Relations.<\/p>\n<p>Generic Relations &#8212; \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0444\u0438\u0447\u0430, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u043e\u043c\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443 \u0432\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c foreign key \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e ID \u0438\u0437 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043c\u0435\u0442\u044c &#171;foreign key \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443&#187;. \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e \u0434\u0432\u0430 \u043f\u043e\u043b\u044f: \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e content_type, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0436\u0435\u0442, \u043a\u0430\u043a\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0438 object_id, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 id \u0438\u0437 \u0442\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u0427\u0443\u0435\u0442\u0435, \u0447\u0435\u043c \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u043e? \u0422\u0435\u043f\u0435\u0440\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e (\u0447\u0442\u043e \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432 \u0411\u0414 \u0438 \u043a\u043e\u0434), \u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0448\u043e\u043a\u0435 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u0432\u044b\u043a\u0440\u0443\u0442\u0430\u0441\u043e\u0432 \u0438 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0430\u0434\u0438\u0449\u0430.<\/p>\n<p>\u042f \u043e\u0442\u043a\u0440\u043e\u044e \u0432\u0430\u043c \u0441\u0435\u043a\u0440\u0435\u0442: \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c content type, \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u043d\u0435\u0433\u043e, \u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u0443\u0447\u0448\u0435. \u0412\u043e\u0442 <a href=\"https:\/\/lukeplant.me.uk\/blog\/posts\/avoid-django-genericforeignkey\/\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442 \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e<\/a> \u043f\u0440\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0423\u0436\u0430\u0441\u043d\u043e \u0442\u043e, \u0447\u0442\u043e Content Type \u0438\u0434\u0451\u0442 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0441 \u0434\u0436\u0430\u043d\u0433\u043e \u0438 \u043f\u0440\u043e \u044d\u0442\u043e \u043f\u0438\u0448\u0443\u0442 \u043a\u0430\u043a \u043f\u0440\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u044f\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0410\u0445 \u0434\u0430, \u043d\u0430 content types \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 (permissions) \u0432 \u0414\u0436\u0430\u043d\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u043d\u0435 \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c. \u0423\u0440\u0430!<\/p>\n<h3>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/h3>\n<h4>\u041a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/h4>\n<p>\u0422\u043a\u043d\u0438\u0442\u0435 \u043c\u043d\u0435 \u0432 \u043c\u0435\u0441\u0442\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0433\u0434\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u0447\u0442\u043e \u043a\u043e\u0434 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439 (\u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 &#171;data migration&#187;) \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u043e\u0442 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f?<\/p>\n<p>\u0423 \u0414\u0436\u0430\u043d\u0433\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a <code>apps<\/code> \u0438 <code>schema_editor<\/code>. \u0427\u0435\u0440\u0435\u0437 <code>apps<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u043e\u0434\u0435\u043b\u0438, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u043e\u043d\u0430 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e &#8212; \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. \u0418 \u044d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0433\u043b\u0430 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f, \u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u0434 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043d\u0435 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<p>\u041d\u043e \u043d\u0438\u043a\u0442\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0432\u0430\u043c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c <em>\u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e<\/em> \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u041f\u043e \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435: \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0435 \u0432\u0430\u0448 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f, \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"python\"># 0001_auto.py from external import VALUE  def patch_values(apps, schema_editor):     MyModel = apps.get_model(...) MyModel.objects.update(value=VALUE)  class Migration(migrations.Migration): operations = [ migrations.RunPython(patch_values), ]<\/code><\/pre>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0435 \u0443 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>VALUE = 1<\/code>, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>1<\/code>. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0435 <code>VALUE = 2<\/code>, \u0438 \u0442\u0430 \u0436\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>2<\/code>.<\/p>\n<h4>Choices<\/h4>\n<p>\u0412\u043e\u0442 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c <code>CharField<\/code>, \u043a\u0443\u0434\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0443. \u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Django \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c &#8212; \u043d\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>\u043a\u0440\u0430\u0441\u043d\u043e\u0435<\/code> \u0438 <code>\u0431\u0435\u043b\u043e\u0435<\/code>:<\/p>\n<pre><code class=\"python\">class Parent(models.Model):     class Name(models.TextChoices):         RED = '\u043a\u0440\u0430\u0441\u043d\u043e\u0435'         WHITE = '\u0431\u0435\u043b\u043e\u0435'     name = models.CharField('name', max_length=255, choices=Name.choices)<\/code><\/pre>\n<p>\u041d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435 \u0438 \u0444\u043e\u0440\u043c\u0430\u0445, \u0430 \u043c\u043e\u0434\u0435\u043b\u044f\u043c \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u0411\u0414 \u0432 \u043e\u0431\u0449\u0435\u043c \u043f\u043b\u0435\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u0430\u0448\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f &#8212; \u0443 \u0411\u0414 \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u043d\u0438\u0435 \u043f\u0440\u043e <code>CharField<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0438 \u043e\u043d\u0430, \u0441\u043e\u043e\u0431\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0432\u0441\u0451 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0434\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>\u044f\u0443\u043c\u0430\u043c\u044b\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442<\/code>.<\/p>\n<pre><code class=\"python\">>>> from demo.models import * >>> Parent.objects.first() &lt;Parent: Parent object (1)> >>> p = Parent.objects.first() >>> p.name '\u043a\u0440\u0430\u0441\u043d\u043e\u0435' >>> p.name = '\u044f\u0443\u043c\u0430\u043c\u044b\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442' >>> p.save() >>> p.name '\u044f\u0443\u043c\u0430\u043c\u044b\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442'<\/code><\/pre>\n<p>\u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e, \u0432\u044b \u0432\u0434\u0440\u0443\u0433 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u0442\u0435, \u0447\u0442\u043e choices \u0442\u0430\u043c \u0432\u0441\u0451 \u0442\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c. \u0418 \u0447\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 &#8212; \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 choices \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0438 \u043d\u043e\u0432\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0432 \u0431\u0430\u0437\u0435 \u0447\u0442\u043e-\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c. \u041d\u043e \u043d\u0435\u0442.<\/p>\n<pre><code class=\"python\">    operations = [         migrations.AlterField(             model_name='parent',             name='name',             field=models.CharField(choices=[('\u043a\u0440\u0430\u0441\u043d\u043e\u0435', 'Red'), ('\u0431\u0435\u043b\u043e\u0435', 'White')], max_length=255, verbose_name='name'),         ),     ]<\/code><\/pre>\n<h4>Chunking, zero downtime<\/h4>\n<p>\u0412 \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 100 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<p>\u041d\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0443 \u043c\u0435\u043d\u044f 100 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432. \u041f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u0443\u0436\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u0447\u043d\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0418\u043d\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0430\u043c data migrations, \u0430 \u0432\u0441\u0451, \u0447\u0442\u043e \u0414\u0436\u0430\u043d\u0433\u043e \u043c\u043e\u0436\u0435\u0442 &#8212; <s>\u043a\u043e\u043f\u0430\u0442\u044c \u0438\u043b\u0438 \u043d\u0435 \u043a\u043e\u043f\u0430\u0442\u044c<\/s> \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0431\u0435\u0437 \u043d\u0435\u0451. \u041d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u0430\u0441\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0430\u043d\u043a\u0430\u043c\u0438, \u043d\u043e \u0432 \u0414\u0436\u0430\u043d\u0433\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u0442.<\/p>\n<p><code>CREATE INDEX CONCURRENTLY<\/code> <a href=\"https:\/\/stackoverflow.com\/questions\/30532509\/do-django-db-index-migrations-run-concurrently\" rel=\"noopener noreferrer nofollow\">\u0442\u043e\u0436\u0435 \u043d\u0435\u0442<\/a>, \u0432\u044b \u0441\u043e\u043c\u043d\u0435\u0432\u0430\u043b\u0438\u0441\u044c?<\/p>\n<h4>lambda<\/h4>\n<p>\u041d\u0435\u043b\u044c\u0437\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044f\u043c\u0431\u0434\u0443 \u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\">class School(models.Model):     name = models.CharField(..., default=lambda: random.choice(names))  # FUCK YOU!<\/code><\/pre>\n<p>\u041d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e:<\/p>\n<pre><code class=\"python\">def random_name(): return random.choice(names)  class School(models.Model):     name = models.CharField(..., default=random_name)  # OKAY :)<\/code><\/pre>\n<p>\u0410 \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c callable default \u0432 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438?.. \u041a\u0441\u0442\u0430\u0442\u0438,<\/p>\n<h3>callable default<\/h3>\n<p>&#8230;\u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0430 \u044e\u0437-\u043a\u0435\u0439\u0441\u0430, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e: random \u0438 datetime.now, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0442\u0430\u043a \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 auto_now_add. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 &#171;\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u0435\u0439&#187; \u043d\u0435\u0442!<\/p>\n<h3>sqlalchemy<\/h3>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439, \u0441 \u043a\u0435\u043c \u044f \u043e\u0431\u0449\u0430\u043b\u0441\u044f, \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0432 sqlalchemy \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043c\u043e\u0437\u0433\u043e\u0432\u044b\u043d\u043e\u0441\u044f\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u0432 django ORM. Alembic \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c. Sqlalchemy \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a\u0430\u043a \u0438\u043c\u044f \u043f\u043e\u043b\u044f \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435. SQLalchemy \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 core \u0438 orm. SQLalchemy, \u0447\u0451\u0440\u0442 \u0432\u043e\u0437\u044c\u043c\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u0430\u043b\u0445\u0438\u043c\u0438\u044e \u044f \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u043b \u0432 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438, \u044f \u0431\u043e\u044e\u0441\u044c \u0434\u0430\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u0435\u0449\u0451 \u0432\u0441\u0435\u0433\u043e. \u041d\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u043b\u0445\u0438\u043c\u0438\u044f <a href=\"https:\/\/stackoverflow.com\/a\/66360789\/1935381\" rel=\"noopener noreferrer nofollow\">\u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c<\/a>, \u0447\u0442\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0411\u0414 <em>\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/em>.  \u0415\u0441\u043b\u0438 \u0431\u044b \u043d\u0435 \u043e\u0434\u0438\u043d \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a.<\/p>\n<h3>Meta<\/h3>\n<p>\u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>Meta<\/code>:<\/p>\n<pre><code class=\"python\">from django.db import models  class School(models.Model): # ... class Meta:   ordering = ['pk'] verbose_name = 'school' verbose_name_plural = 'schools' constraints = [ # ... ]<\/code><\/pre>\n<h4>Meta.ordering<\/h4>\n<p><code>ordering<\/code> \u0437\u0430\u0434\u0430\u0451\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0447\u0442\u043e \u0447\u0440\u0435\u0432\u0430\u0442\u043e. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, <code>ordering<\/code> \u0446\u0435\u043f\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0437\u0434\u0435 \u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, <a href=\"https:\/\/github.com\/reef-technologies\/python-review-zoo\/#django-default-model-ordering\" rel=\"noopener noreferrer nofollow\">\u0431\u044b\u0432\u0430\u044e\u0442<\/a> <a href=\"https:\/\/github.com\/reef-technologies\/python-review-zoo\/#django-order_by-annotation-phenomenon\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u043c\u0435\u043d\u0442\u044b<\/a>, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u0438 \u0432\u0430\u0436\u043d\u043e <em>\u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c<\/em> \u0435\u0451 &#171;\u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c&#187; \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>order_by()<\/code>.<\/p>\n<p>\u042f\u0432\u043d\u043e\u0435 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e, \u0438 \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u043a\u0443 \u044f\u0432\u043d\u043e \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 &#8212; \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430.<\/p>\n<h4>Meta: \u043a\u043b\u0430\u0441\u0441 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435<\/h4>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>Meta<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f &#171;\u0432\u043d\u0443\u0442\u0440\u0438&#187; \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0434\u0435\u043b\u0438. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, <code>Meta<\/code> \u043a\u0430\u043a \u0431\u044b &#171;\u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442&#187; \u043a\u043b\u0430\u0441\u0441\u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0435\u0433\u043e &#171;\u043c\u0435\u0442\u0430-\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430&#187;.<\/p>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 &#171;\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439&#187; \u043a\u043b\u0430\u0441\u0441 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a\u043e &#171;\u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443&#187; \u043a\u043b\u0430\u0441\u0441\u0443. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0438: \u0438\u0437 <code>Meta<\/code> \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0441\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u0418\u0437 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u043e <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/topics\/db\/models\/#meta-inheritance\" rel=\"noopener noreferrer nofollow\">\u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445<\/a> Meta \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043e \u044f\u0432\u043d\u043e.<\/p>\n<h4>\u0421\u0442\u0440\u043e\u043a\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432<\/h4>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0438\u0437-\u0437\u0430 \u043f\u0443\u043d\u043a\u0442\u0430 \u0432\u044b\u0448\u0435 \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c<\/p>\n<pre><code class=\"python\">class School:     class Meta:     ordering = [School.id]   constraints = [     UniqueConstraint(fields=[School.name], name='unique_school_name'),   ]<\/code><\/pre>\n<p>\u0414\u0430 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0414\u0436\u0430\u043d\u0433\u043e, \u0442\u043e \u0442\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u044f\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c \u043c\u043e\u0434\u0435\u043b\u0438:<\/p>\n<pre><code class=\"python\">School.objects.values_list('id', 'name') # \u0430 \u043d\u0435 School.objects.values_list(School.id, School.name)  School.objects.filter(name__icontains='a') # \u0430 \u043d\u0435 School.objects.filter(School.name.icontains('a'))<\/code><\/pre>\n<p>\u042f \u044f\u0440\u044b\u0439 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, <code>NamedTuple<\/code> \u0438\u043b\u0438 <code>dataclass<\/code>. \u041d\u043e \u0414\u0436\u0430\u043d\u0433\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044f \u043f\u043b\u0430\u043a\u0430\u0442\u044c.<\/p>\n<h4>Custom Meta<\/h4>\n<p><code>Meta<\/code> \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u043c\u0435\u0441\u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0441\u0432\u043e\u0438, \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043c\u0435\u0442\u0430-\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0434\u0435\u043b\u0438. \u042f \u0442\u0443\u0434\u0430 \u043f\u0438\u0441\u0430\u043b \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438. \u041f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441 <code>Meta<\/code> &#171;\u0437\u043b\u043e\u0439 \u043f\u043e\u043b\u0438\u0446\u0435\u0439\u0441\u043a\u0438\u0439&#187; \u0438 \u043f\u043e\u0448\u043b\u0451\u0442 \u0432\u0430\u0441 \u043f\u0440\u0438 \u043c\u0430\u043b\u0435\u0439\u0448\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, <code>ModelAdmin<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, &#171;\u0434\u043e\u0431\u0440\u044b\u0439 \u043f\u043e\u043b\u0438\u0446\u0435\u0439\u0441\u043a\u0438\u0439&#187; \u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <code>inline<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>inlines<\/code>. \u041f\u043e\u0447\u0435\u043c\u0443? Because fuck you, that&#8217;s why.<\/p>\n<h3>Temporary fields<\/h3>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 &#171;\u043d\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c&#187; \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u0438\u0445 \u043a\u0430\u043a-\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c. \u042d\u0442\u043e \u043f\u0440\u0438\u0433\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u044b \u044e\u0437\u0430\u0435\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 &#171;command&#187; &#8212; \u0433\u0434\u0435-\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u0443\u0434\u0430-\u0442\u043e, \u0438 \u0442\u0430\u043c \u0441 \u043d\u0438\u043c \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0423\u0434\u043e\u0431\u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0447\u0451\u0442\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u043e\u043b\u044f, \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 dataclass \u0438 \u0442\u0430\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0422\u0430\u043a \u0432\u043e\u0442, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u043c \u043f\u0443\u043d\u043a\u0442\u0430\u043c, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043f\u043e\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0436\u0430\u043d\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<h4>m2m<\/h4>\n<p>\u0412\u043e \u0432\u0441\u0435 \u043f\u043e\u043b\u044f, \u0434\u0430\u0436\u0435 \u0432 <code>ForeignKey<\/code>.<\/p>\n<p>\u041d\u043e \u043d\u0435 \u0432 <code>ManyToManyField<\/code>. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u044f\u043c \u0441\u0440\u0430\u0437\u0443. \u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 deprecated.<\/p>\n<h3>\u0410 \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043f\u0438\u044e?<\/h3>\n<p>\u041d\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u0445\u043e\u0447\u0443 \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0432 \u0411\u0414.<\/p>\n<p>\u0427\u0442\u043e? \u041d\u0435\u0442, \u043d\u0435\u0442\u0443 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <code>instance.copy()<\/code>, \u044d\u0442\u043e \u0436 \u0414\u0436\u0430\u043d\u0433\u043e! \u0412\u043e\u0442 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431:<\/p>\n<pre><code class=\"python\">instance.id = None instance.save()  # \u0442\u0435\u043f\u0435\u0440\u044c \u0432 instance \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u043e\u043f\u0438\u044f<\/code><\/pre>\n<p>\u0410\u0445 \u0434\u0430, \u0437\u0430\u0431\u044b\u043b \u0441\u043a\u0430\u0437\u0430\u0442\u044c &#8212; \u044d\u0442\u043e \u043d\u0435 deepcopy.<\/p>\n<h3>\u0421\u0438\u0433\u043d\u0430\u043b\u044b<\/h3>\n<p>\u0412 \u0434\u0436\u0430\u043d\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043d \u0441\u0438\u0433\u043d\u0430\u043b\u044b. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0441\u043f___\u0440\u0430\u0441\u0438\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f? \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u044b \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b, \u0442\u043e \u0432\u043e\u0442 \u0432\u0430\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u043d\u0438\u043a:<\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u0433\u043d\u0430\u043b &#8212; \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0432 \u0411\u0414, \u0438\u043b\u0438 \u043a\u0430\u043a \u043f\u043e\u0432\u0435\u0437\u0451\u0442?<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a\u043e\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u0441\u043b\u0443\u0448\u0430\u044e\u0449\u0438\u0445 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435?<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u043b \u0443\u043f\u0430\u043b?<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a \u0432 \u043e\u0442\u0447\u0451\u0442\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u0432\u043b\u0451\u043a\u0448\u0435\u0439 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0435\u0441\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u043b \u0443\u043f\u0430\u043b?<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432\u0430\u0448\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0443\u0442\u0441\u044f \u043f\u0440\u0438 <code>update()<\/code> \u0438\u043b\u0438 <code>bulk_create()<\/code>. \u041d\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u044b <code>pre\/post_delete<\/code> \u0432\u044b\u0437\u043e\u0432\u0443\u0442\u0441\u044f. \u041d\u043e \u043c\u0435\u0442\u043e\u0434 delete() \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f.<\/p>\n<blockquote>\n<p>Note that the delete() method for an object is not necessarily called when deleting objects in bulk using a QuerySet or as a result of a cascading delete. To ensure customized delete logic gets executed, you can use pre_delete and\/or post_delete signals. Unfortunately, there isn\u2019t a workaround when creating or updating objects in bulk, since none of save(), pre_save, and post_save are called.   &#8212; <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/topics\/db\/models\/#overriding-model-methods\" rel=\"noopener noreferrer nofollow\">docs<\/a><\/p>\n<\/blockquote>\n<h3>Changes<\/h3>\n<p>\u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 <code>save()<\/code>. \u041f\u043e\u0448\u043b\u0438 \u0432\u044b!<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u0435 <code>post_save<\/code> \u0435\u0441\u0442\u044c \u0444\u043b\u0430\u0433 <code>created<\/code>, \u0430 \u0432 <code>pre_save<\/code> \u043d\u0435\u0442. \u0422\u0430\u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435.<\/p>\n<h3>Created vs default<\/h3>\n<p>\u0415\u0441\u0442\u044c \u0432 \u0414\u0436\u0430\u043d\u0433\u043e \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0437\u043d\u0430\u0442\u044c, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043b\u0438 \u043d\u0435\u0442 &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 <code>instance.id<\/code>. \u0415\u0441\u043b\u0438 \u0442\u0430\u043c <code>None<\/code>, \u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0435\u0449\u0451 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432 \u043f\u043e\u043b\u0435 <code>id<\/code> \u0435\u0441\u0442\u044c default (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>uuid4<\/code>), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0438, \u0430 \u043d\u0435 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 <code>id<\/code> \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 <code>None<\/code>.<\/p>\n<h3>Instance vs Batch, or Method vs Query<\/h3>\n<p>\u0422\u0443\u0442, \u043f\u0440\u0438\u0437\u043d\u0430\u044e\u0441\u044c, \u0441\u043f\u043e\u0440\u043d\u043e, \u043d\u043e \u043c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u0442 \u0447\u0443\u0432\u0441\u0442\u0432\u043e &#171;\u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438&#187;, \u0438 \u044f \u0432\u043a\u043b\u044e\u0447\u0438\u043b \u044d\u0442\u043e\u0442 \u043f\u0443\u043d\u043a\u0442 \u0441\u044e\u0434\u0430.<\/p>\n<p>\u0418\u0442\u0430\u043a. \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434. \u041c\u043e\u0436\u043d\u043e \u0434\u0443\u043c\u0430\u0442\u044c &#171;\u043d\u0430\u043f\u0438\u0448\u0443 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e&#187; \u0438 \u043e\u0442\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u044e \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u0443\u043c\u0430\u0442\u044c &#171;\u043d\u0430\u043f\u0438\u0448\u0443 \u0434\u043b\u044f \u0442\u044b\u0441\u044f\u0447\u0438, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e&#187;. \u0414\u0436\u0430\u043d\u0433\u043e \u0442\u043e\u043b\u043a\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0434\u0443\u043c\u0430\u0442\u044c &#171;\u043f\u043e-\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e&#187;, &#171;per instance&#187;. \u0412\u043e\u0442 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435.<\/p>\n<p>\u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f <em>\u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/em>? \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c model.save() \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u044b. \u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f <em>\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/em>? \u0414\u0430 \u043d\u0438\u043a\u0430\u043a, \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0451.<\/p>\n<p>\u041a\u0430\u043a \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442? \u0414\u0430 \u043f\u0440\u043e\u0441\u0442\u043e, \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041a\u0430\u043a \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432? \u0414\u0430 \u043d\u0438\u043a\u0430\u043a, \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0451 \u0432 admin_actions.<\/p>\n<p>\u0412 \u0430\u0434\u043c\u0438\u043d\u043a\u0435 \u0443 \u0432\u0430\u0441 25 \u0448\u0442\u0443\u043a \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0414\u0436\u0430\u043d\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432 list_display \u043c\u0435\u0442\u043e\u0434\/\u043f\u043e\u043b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u043b\u0438 \u0430\u0434\u043c\u0438\u043d \u043a\u043b\u0430\u0441\u0441\u0430, \u043d\u043e \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u043f\u043e\u043b\u0435 \u0438\u0437 annotate \/ aggregate.<\/p>\n<p>\u0412 \u0414\u0436\u0430\u043d\u0433\u043e \u0432\u043e\u0437\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u0430\u0431\u0441\u043e\u043b\u044e\u0442, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441 <em>python<\/em> \u043a\u043e\u0434\u043e\u043c. \u0427\u0442\u043e, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 1000 \u0441\u0442\u0440\u043e\u043a? \u0414\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e &#8212; \u043b\u0438\u0431\u043e \u0431\u0443\u0434\u0435\u0442 1000 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 1000 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043b\u0438\u0431\u043e \u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u043b\u044f batch processing.<\/p>\n<p>\u0421\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0430\u0441\u0442\u043e \u044f \u043d\u0430\u0445\u043e\u0434\u0438\u043b \u0441\u0435\u0431\u044f \u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u0435\u0451 \u0436\u0435 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 QuerySet. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0445\u0438\u0442\u0440\u044b\u0439 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438: <code>def get_status()<\/code>. \u0410 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0434\u043b\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 25 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0438 \u0430\u0434\u043c\u0438\u043d\u043a\u0438 &#8212; \u0438 \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0432\u0441\u0451 \u043d\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u043b\u043e, \u044f \u043f\u0438\u0448\u0443 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 QuerySet \u0441 <code>def with_status()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 SQL \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u0435 <code>status<\/code>, \u0432\u0441\u044f\u043a\u0438\u0435 \u0442\u0430\u043c <code>Case()<\/code> \u0438 \u043f\u0440\u043e\u0447\u0435\u0435.<\/p>\n<pre><code class=\"python\">def with_status(self):         return self.annotate(             num_approved_prospects=Sum(Case(When(prospects__is_approved=True, then=1), default=0)),             num_prospects=Count('prospects'),             num_validated_emails=Sum(Case(When(prospects__emails__is_valid=True, then=1), default=0)),             num_emails=Count('prospects__emails')         ).annotate(             status=Case(                 When(created__lte=now() - settings.CAMPAIGN_OBSOLENCE_PERIOD, then=Value(\"Obsolete\")),                 When(num_prospects__gt=0, num_approved_prospects=0, then=Value(\"Pending Prospects Approval\")),                 When(num_emails__gt=0, num_validated_emails=0, then=Value(\"Pending Emails Validation\")),                 default=Value(\"OK\")             )         )<\/code><\/pre>\n<p>\u0410 \u0447\u0442\u043e\u0431\u044b DRY, \u044f \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e <code>def get_status<\/code> \u0447\u0435\u0440\u0435\u0437 <code>with_status<\/code>: <\/p>\n<pre><code class=\"python\">def get_status(self): return self.__class__.objects.filter(pk=self.pk).with_status().values_list('status', flat=True)[0]<\/code><\/pre>\n<p>\u0422\u0443\u043f\u043e\u0441\u0442\u044c \u043a\u0430\u043a\u0430\u044f-\u0442\u043e, \u043d\u043e \u0442\u0443\u043f\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0430\u044f. \u0422\u0430\u043a\u043e\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f, \u0438 \u0434\u0436\u0430\u043d\u0433\u043e \u043a\u0430\u043a-\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<h3>Slice &amp; pagination<\/h3>\n<p>\u0412 \u0414\u0436\u0430\u043d\u0433\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0437\u044f\u0442\u044c \u0441\u043b\u0430\u0439\u0441 \u043e\u0442 QuerySet, \u0442\u0438\u043f\u0430 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">Photo.objects.all().order_by('id')[10:20]<\/code><\/pre>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e limit-offset. Limit-offset \u043f\u043b\u043e\u0445\u043e, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 offset, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043a\u0430\u043d \u0432\u0441\u0435\u0433\u043e \u043e\u0444\u0444\u0441\u0435\u0442\u0430. \u041f\u043b\u044e\u0441 \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u044d\u0442\u043e undefined behavior, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0431\u044b\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c order_by. \u041f\u043b\u044e\u0441 \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043f\u0430\u0441\u0430\u044e\u0442 \u043a\u0443\u0440\u0441\u043e\u0440\u044b, \u0438\u043b\u0438 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u043f\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443. \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0433\u0430\u0434\u0430\u0439\u0442\u0435, \u043a\u0430\u043a \u0432 \u0434\u0436\u0430\u043d\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f?<\/p>\n<h3>\u0413\u0434\u0435 \u043c\u043e\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u044b?<\/h3>\n<p>\u0414\u0430 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432 \u0414\u0436\u0430\u043d\u0433\u043e \u043a\u0430\u043a-\u0442\u043e \u043d\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0434\u0443\u043c\u0430\u0442\u044c \u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u0430\u0445. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 100 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0442\u043e \u0430\u0434\u043c\u0438\u043d\u043a\u0430 \u0437\u0430\u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043c \u0432 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Model.objects.count() \u0438 \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c 100 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<p>\u0418\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e queryset \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442, \u0445\u043e\u0442\u044f \u0432\u0440\u043e\u0434\u0435 \u0431\u044b iterator() \u0431\u044b\u043b \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432: <a href=\"https:\/\/stackoverflow.com\/questions\/4222176\/why-is-iterating-through-a-large-django-queryset-consuming-massive-amounts-of-me\" rel=\"noopener noreferrer nofollow\">https:\/\/stackoverflow.com\/questions\/4222176\/why-is-iterating-through-a-large-django-queryset-consuming-massive-amounts-of-me<\/a><\/p>\n<p>\u0417\u0430\u0442\u043e \u0437\u043d\u0430\u0435\u0442\u0435, \u0433\u0434\u0435 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u043f\u043e id \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0435\u0441\u0442\u044c? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, <a href=\"https:\/\/www.django-rest-framework.org\/api-guide\/pagination\/#cursorpagination\" rel=\"noopener noreferrer nofollow\">\u0432 django-rest-framework<\/a>.<\/p>\n<h3>Get \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d<\/h3>\n<p>\u0415\u0441\u0442\u044c <code>Photo.objects.filter(id=5).first()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0440\u043d\u0451\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043b\u0438 <code>None<\/code> &#8212; \u0443\u0434\u043e\u0431\u043d\u043e. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430 <code>None<\/code> \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c <\/p>\n<pre><code class=\"python\">try:     instance = Photo.objects.get(id=5) except Photo.DoesNotExist:     # handle this case except MultipleObjectsReturned:     # fuck<\/code><\/pre>\n<p><code>MultipleObjectsReturned<\/code> \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0432\u044b \u043e\u0436\u0438\u0434\u0430\u043b\u0438 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432\u0435\u0440\u043d\u0443\u043b\u0438\u0441\u044c, \u0430 \u0441 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e 99% \u0432\u0430\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c. \u041f\u043b\u044e\u0441 \u043a\u043e \u0432\u0441\u0435\u043c\u0443 <code>MultipleObjectsReturned<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u043e\u0435&#8230; \u0447\u0442\u043e \u043a\u0442\u043e-\u0442\u043e \u0437\u0430\u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c unique constraint. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0443\u043d\u043a\u0442.<\/p>\n<h3>Uniqueness on nullable<\/h3>\n<p>\u0422\u0430\u043a \u0443\u0436 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0411\u0414, \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c unique constraint \u043d\u0430 nullable \u043f\u043e\u043b\u0435. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0441\u0430\u043c\u0438:<\/p>\n<blockquote>\n<p>You can insert <strong>NULL<\/strong> values into columns with the UNIQUE constraint because NULL is the absence of a value, so it is never equal to other NULL values and not considered a duplicate value. This means that it&#8217;s possible to insert rows that appear to be duplicates if one of the values is NULL .<\/p>\n<\/blockquote>\n<p>\u0418 \u044f \u0431\u044b\u043b \u0431\u044b \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u0431\u044b \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e unique constraint \u0432\u044b\u043b\u0435\u0437\u0430\u043b \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c warning \u0442\u0438\u043f\u0430 &#171;\u0410\u043b\u0435\u043a\u0441\u0435\u0439, \u0442\u044b \u0447\u0451\u0440\u0442? \u0427\u0442\u043e \u0442\u0432\u043e\u0440\u0438\u0448\u044c?&#187;. \u041d\u043e \u043d\u0435\u0442.<\/p>\n<h3>Instance comparison<\/h3>\n<p>\u0414\u0432\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e <code>id<\/code>. \u042f \u043d\u0435 \u043c\u043e\u0433\u0443 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u044e\u0437-\u043a\u0435\u0439\u0441, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u043b\u044f\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043c\u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e <code>id<\/code> \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f <code>is<\/code>.<\/p>\n<h3>Parametrized related name<\/h3>\n<p>\u0414\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 <code>related_name='%(model)s'<\/code>, \u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>MySuperLongModelName<\/code>, \u0442\u043e <code>related_name<\/code> \u0441\u0442\u0430\u043d\u0435\u0442 <code>mysuperlongmodelname<\/code>, \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c. \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0438\u043c \u043f\u0440\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 <code>pascalize<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 <code>my_super_long_model_name<\/code>.<\/p>\n<h3>Model managers<\/h3>\n<p>\u0415\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0448\u0442\u0443\u043a\u0430: ModelManager.<\/p>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/7692487\/using-django-managers-vs-staticmethod-on-model-class-directly\/7693340\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u0447\u0435\u043c \u044d\u0442\u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b?<\/a> \u0425\u0435\u0445, \u043d\u0443 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u0434\u0436\u0430\u043d\u0433\u043e \u0442\u043e\u0433\u0434\u0430 \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u0438\u0442\u043e\u043d\u0430 \u0434\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043f\u0440\u043e <code>@classmethod<\/code>. \u0411\u044b\u0432\u0430\u0435\u0442!<\/p>\n<h3>BigAutoField<\/h3>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u044b \u0434\u0436\u0430\u043d\u0433\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u043e \u0437\u0430\u043a\u043e\u043d\u0435 \u041c\u0443\u0440\u0430, \u0432\u0441\u0451 \u0443\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e, ipv4 \u043a\u043e\u043d\u0447\u0430\u044e\u0442\u0441\u044f, \u0430 \u0432\u0434\u0440\u0443\u0433 ID \u0442\u043e\u0436\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0430\u0442\u0441\u044f? \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043b\u0443\u043f\u0430\u0448\u0438\u043c \u043d\u0435 2147483647, \u0430 9223372036854775807 \u043a\u0430\u043a \u043b\u0438\u043c\u0438\u0442 ID. \u0412\u0441\u0435\u043c! \u041d\u0443 \u0434\u0430, \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0443\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u043d\u043e \u0437\u0430\u0442\u043e \u041c\u0443\u0440 \u043f\u043e\u0431\u0435\u0436\u0434\u0451\u043d.<\/p>\n<h3>Atomic requests<\/h3>\n<p><code>ATOMIC_REQUESTS<\/code> \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442 <em>\u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0430\u0439\u0442\u0443 \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e<\/em>. \u041c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043a\u0430\u0434\u0440\u044b \u0441 \u0441\u043e\u0432\u0435\u0449\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0414\u0436\u0430\u043d\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0438 \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/358\/180\/d07\/358180d0766581ec6f90ef0f696e0517.jpg\" width=\"500\" height=\"649\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/358\/180\/d07\/358180d0766581ec6f90ef0f696e0517.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<h2>Permissions<\/h2>\n<h3>C[R]UD<\/h3>\n<p>\u0414\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0431\u044b\u043b\u043e:<\/p>\n<ul>\n<li>\n<p>Create permission<\/p>\n<\/li>\n<li>\n<p><s>Read permission<\/s> Fuck you!<\/p>\n<\/li>\n<li>\n<p>Update permission<\/p>\n<\/li>\n<li>\n<p>Delete permission<\/p>\n<\/li>\n<\/ul>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044d\u0442\u043e \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u043b\u0438, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u0442\u044c permission \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435. \u041d\u0443 \u0437\u0430\u0431\u044b\u043b\u0438, \u0447\u043e!<\/p>\n<h2>Settings<\/h2>\n<h3>\u0410 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b?<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u0436\u0430\u043d\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442, \u043d\u0430\u0439\u0434\u0442\u0435 \u0432 \u043d\u0451\u043c <code>settings.py<\/code> (\u0435\u0441\u043b\u0438 \u043e\u043d \u0442\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d, \u0442\u043e \u0432\u0430\u043c \u043f\u043e\u0432\u0435\u0437\u043b\u043e), \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u0430\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 \u0432 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u043f\u0430\u043f\u043a\u0435 \u043b\u0438\u043d\u0443\u043a\u0441\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/8f3\/c10\/973\/8f3c10973e0540deca87e9e7fbf0de36.jpg\" width=\"1144\" height=\"919\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8f3\/c10\/973\/8f3c10973e0540deca87e9e7fbf0de36.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0441\u043e\u0444\u0442\u0438\u043d\u0430 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u0441\u0432\u043e\u044e \u043f\u0430\u043f\u043a\u0443 \u0432\u0430\u043c \u0432 <code>home<\/code>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u044f\u0432\u0438\u0442\u044c \u043e \u0441\u0432\u043e\u0451\u043c \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438. \u0412 \u0434\u0436\u0430\u043d\u0433\u043e \u0442\u0430 \u0436\u0435 \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f &#8212; \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 <code>settings.py<\/code>, \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u0438\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0442\u043d\u043e \u0432\u0441\u0435\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435.<\/p>\n<h3>\u0410 \u043f\u043e\u0447\u0435\u043c\u0443, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b?<\/h3>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438! \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u0438 \u0434\u0430\u0436\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u0444\u0430\u0439\u043b\u044b \u0432 \u0434\u0440\u0443\u0433\u0438\u0435, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u0414\u0436\u0430\u043d\u0433\u043e \u043f\u043e\u0434\u0441\u0442\u0440\u0435\u043a\u0430\u0435\u0442 \u043d\u0430 \u044d\u0442\u043e &#8212; \u0438\u043c\u0435\u0442\u044c \u043d\u0435-\u0435\u0434\u0438\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a &#8212; \u0432\u0435\u0434\u044c \u0435\u0441\u0442\u044c <code>DJANGO_SETTINGS_MODULE<\/code> env var, \u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043c\u043e\u0436\u043d\u043e <code>manage.py runserver --settings ...<\/code>.<\/p>\n<h3>\u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043c \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438<\/h3>\n<p>\u042d\u0442\u043e \u0432\u0430\u043c \u043d\u0435 <code>.ini<\/code> \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u0442\u0443\u0442 \u043d\u0435\u0442 \u0441\u0435\u043a\u0446\u0438\u0439. \u042d\u0442\u043e \u0432\u0430\u043c \u043d\u0435 <code>.yaml<\/code> \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u0442\u0443\u0442 \u043d\u0435\u0442 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438. \u042d\u0442\u043e <code>.py<\/code> \u0444\u0430\u0439\u043b, \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0433\u0434\u0435 \u0432\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432\u0441\u044f \u043c\u043e\u0449\u044c \u044f\u0437\u044b\u043a\u0430, \u0434\u0430\u0442\u0430\u043a\u043b\u0430\u0441\u0441\u044b \u0442\u0430\u043c, \u043f\u0438\u0434\u0430\u043d\u0442\u0438\u043a\u0438 \u0432\u0441\u044f\u043a\u0438\u0435 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435! \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 &#171;\u043a\u043b\u044e\u0447 = \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435&#187;, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">SECRET_KEY = '12345' DEBUG = True CELERY_BROKER_URL = '' CELERY_RESULT_BACKEND = '' CELERY_RESULT_EXPIRES = int(timedelta(days=1).total_seconds()) CELERY_COMPRESSION = 'gzip' CELERY_MESSAGE_COMPRESSION = 'gzip' CELERY_SEND_EVENTS = True<\/code><\/pre>\n<p>\u041d\u0443, \u043e\u043a\u0435\u0439 &#8212; \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>dict<\/code>. \u041d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 <code>dataclass<\/code> \u0438\u043b\u0438 <code>named tuple<\/code>!<\/p>\n<h3>\u041f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u0436\u0430\u043d\u0433\u043e: \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0441\u0451 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0442\u0440\u043e\u043a!<\/h3>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 <em>\u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/em> \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0432\u0430\u0448\u0435\u0439 IDE, \u0438 jump to definition \u043c\u043e\u0436\u0435\u0442 \u0432\u0434\u0440\u0443\u0433 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041d\u0443 \u0435\u0433\u043e, \u043e\u0442 \u0433\u0440\u0435\u0445\u0430 \u043f\u043e\u0434\u0430\u043b\u044c\u0448\u0435!<\/p>\n<pre><code class=\"python\">INSTALLED_APPS = [     'django.contrib.admin',     'django.contrib.auth',     'django.contrib.contenttypes',     'django.contrib.sessions',     'django.contrib.messages',     'django.contrib.staticfiles',      'django_extensions',     'django_probes',     'rest_framework',      'project.core', ]  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.messages.middleware.MessageMiddleware',     'django.middleware.clickjacking.XFrameOptionsMiddleware', ]<\/code><\/pre>\n<h3>\u0410 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435<\/h3>\n<p>\u0412\u043e\u0442 \u0432\u0430\u0448 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a: <code>project\/core\/settings.py<\/code>,  \u0432 \u043d\u0451\u043c \u0435\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 <code>DEBUG = True<\/code>. \u0412\u043e\u0442 \u0432\u044b \u0435\u0433\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u0432 \u0434\u0436\u0430\u043d\u0433\u043e: <code>from django.conf import settings; print(settings.DEBUG)<\/code>. IDE \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 \u0432\u0430\u0441 \u0441 \u0443\u043f\u0440\u0451\u043a\u043e\u043c \u0438 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0451 \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c.<\/p>\n<h3>Env vars \u0434\u043b\u044f \u0441\u043b\u0430\u0431\u0430\u043a\u043e\u0432<\/h3>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0414\u0436\u0430\u043d\u0433\u043e, \u043e\u043d \u043b\u044e\u0431\u0435\u0437\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0432\u0430\u043c <code>settings.py<\/code> \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u0437\u0430 \u0432\u0430\u0441 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 <code>DEBUG<\/code> \u0438 <code>SECRET_KEY<\/code>, \u043a\u0430\u043a \u0431\u044b \u0433\u043e\u0432\u043e\u0440\u044f: &#171;\u0447\u0443\u0432\u0430\u043a, \u0432\u0441\u0451 \u043a\u0440\u0443\u0442\u043e, \u044f \u0443\u0436\u0435 \u0441\u0433\u0435\u043d\u0435\u043d\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0431\u044f, \u043c\u044b \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435, \u043a\u043e\u043c\u043c\u0438\u0442\u044c \u0432 \u0440\u0435\u043f\u0443 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0441\u043a\u043e\u0440\u0435\u0439&#187;.<\/p>\n<p>\u0422\u0430\u043a, \u0441\u0442\u043e\u043f! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430.<\/p>\n<p>\u0415\u0441\u0442\u044c 12 factor apps, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u044e\u0437\u0430\u0439\u0442\u0435 env vars \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u042f \u0432\u044b\u0432\u0435\u043b \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0442\u0430\u043a\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443: \u0432 <code>.env<\/code> \u0444\u0430\u0439\u043b (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043f\u043e\u0434 VCS) \u044f \u043a\u043b\u0430\u0434\u0443 <em>\u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438<\/em>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u043a \u0434\u0440\u0443\u0433\u043e\u0439 (\u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 A \u0438\u043b\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 B, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 .env \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u043e\u0447\u0435\u043d \u043f\u043e\u0434 \u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435). \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 <code>settings.py<\/code> \u0443 \u043c\u0435\u043d\u044f \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a:<\/p>\n<ol>\n<li>\n<p>\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 env vars (\u0441 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0435\u0439 \u0442\u0438\u043f\u0430), \u0447\u0442\u043e\u0431\u044b \u044f \u043c\u043e\u0433 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: <code>DEBUG = env.bool('DEBUG', default=False)<\/code><\/p>\n<\/li>\n<li>\n<p>\u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043c\u0435\u043d\u0435 \u0441\u0440\u0435\u0434\u044b &#8212; \u043d\u0443 \u0442\u0430\u043c <code>I18N<\/code> \u0438\u043b\u0438 <code>INSTALLED_APPS<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418 \u044f \u0432\u043e\u0442 \u044d\u0442\u043e \u0432\u0441\u0451 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e, \u0430 \u0432 \u0434\u0436\u0430\u043d\u0433\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0438\u0433\u0430\u0447\u0438\u0442\u044c \u0432\u0441\u0451 \u0432 <code>settings.py<\/code>, \u0430 \u0442\u043e \u0438 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445: <code>settings.dev.py<\/code>, <code>settings.prod.py<\/code> &#8212; \u0432\u0435\u0434\u044c \u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u043e\u043d\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 <code>DJANGO_SETTINGS_MODULE<\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a. \u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u043e \u043d\u0435\u0442.<\/p>\n<h2>App config<\/h2>\n<p>\u042f \u043f\u044b\u0442\u0430\u043b\u0441\u044f, \u0440\u0435\u0431\u044f\u0442\u0430. \u042f \u043f\u044b\u0442\u0430\u043b\u0441\u044f. \u041d\u043e \u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u0441\u043c\u043e\u0433 \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u0444\u0438\u0433\u0430 \u043d\u0443\u0436\u043d\u044b <code>AppConfig<\/code>.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b <a href=\"https:\/\/medium.com\/codex\/understanding-djangos-apps-and-appconfig-2cb57e44c80e\" rel=\"noopener noreferrer nofollow\">\u0432\u043e\u0442 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e<\/a>, \u0433\u0434\u0435 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u043e\u0447\u0442\u0435\u043d\u043d\u044b\u0439 \u041c\u0443\u0445\u0430\u043c\u043c\u0435\u0434 \u0434\u043e\u043b\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u044d\u0442\u0438 \u0410\u043f\u043f\u041a\u043e\u043d\u0444\u0438\u0433\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u0438 \u0441\u043c\u044b\u0441\u043b \u0438\u0445 \u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>ready()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f&#8230; \u0447\u0442\u043e\u0430? \u041d\u0435\u0442, \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e, \u0442\u0430\u043a \u0438 \u043f\u0438\u0448\u0435\u0442:<\/p>\n<blockquote>\n<p>The key reason to define a custom <code>AppConfig<\/code> class is to implement the <code>ready()<\/code> method, that has been declared in <code>django.apps.Appconfig<\/code> class. When Django loads the project and its apps, the <code>ready()<\/code> method is called on the <code>AppConfig<\/code> instnace of each app. Hence we can use the <code>ready()<\/code> method to change any of our app\u2019s existing setup or to add to it.<\/p>\n<\/blockquote>\n<p>\u041d\u0443 \u044d\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u0437\u0430 \u0433\u0440\u0430\u043d\u044c\u044e \u043c\u043e\u0435\u0433\u043e \u0440\u0430\u0437\u0443\u043c\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u044e \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440&#8230;<\/p>\n<blockquote>\n<p><strong>Conclusion<\/strong> <code>Apps<\/code> and <code>AppConfig<\/code> are powerful tools.<\/p>\n<\/blockquote>\n<p>\u0410, \u0443\u0436\u0435 \u0432\u044b\u0432\u043e\u0434. \u041d\u0443 \u043b\u0430\u0434\u043d\u043e.<\/p>\n<p>\u041a \u0447\u0451\u0440\u0442\u0443 \u044d\u0442\u043e\u0442 \u043c\u0435\u0434\u0438\u0443\u043c, \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 \u0441\u0442\u044d\u043a\u043e\u0432\u0435\u0440\u0444\u043b\u043e\u0443 <a href=\"https:\/\/stackoverflow.com\/questions\/32795227\/what-is-the-purpose-of-apps-py-in-django-1-9\/32795405\" rel=\"noopener noreferrer nofollow\">\u043c\u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442<\/a>:<\/p>\n<blockquote>\n<p><strong>Purpose of <\/strong><code>apps.py<\/code> file: This file is created to help the user include any <a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/ref\/applications\/#application-configuration\" rel=\"noopener noreferrer nofollow\">application configuration<\/a> for the app. Using this, you can configure some of the attributes of the application.<\/p>\n<\/blockquote>\n<p>\u041b\u0430\u0434\u043d\u043e, App Config &#8212; \u044d\u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u044f \u043c\u043e\u0433\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041a\u0430\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438? \u041f\u0443\u0441\u0442\u044c <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/ref\/applications\/#application-configuration\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u0414\u0436\u0430\u043d\u0433\u043e<\/a>:<\/p>\n<blockquote>\n<p>Application configuration objects store metadata for an application. Some attributes can be configured in <code>AppConfig<\/code> subclasses. Others are set by Django and read-only.<\/p>\n<\/blockquote>\n<p>App Config \u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<ul>\n<li>\n<p><code>name<\/code> == Full Python path to the application, e.g. <code>'django.contrib.admin'<\/code><\/p>\n<\/li>\n<li>\n<p><code>label<\/code> == Short name for the application, e.g. <code>'admin'<\/code><\/p>\n<\/li>\n<li>\n<p><code>verbose_name<\/code> == Human-readable name for the application, e.g. \u201cAdministration\u201d<\/p>\n<\/li>\n<li>\n<p><code>path<\/code> == Filesystem path to the application directory, e.g. <code>'\/usr\/lib\/pythonX.Y\/dist-packages\/django\/contrib\/admin'<\/code><\/p>\n<\/li>\n<li>\n<p><code>default<\/code> == Set this attribute to <code>False<\/code> to prevent Django from selecting a configuration class automatically. This is useful when <code>apps.py<\/code> defines only one <code>AppConfig<\/code> subclass but you don\u2019t want Django to use it by default.<\/p>\n<\/li>\n<li>\n<p><code>default_auto_field<\/code> == The implicit primary key type to add to models within this app. You can use this to keep <code>AutoField<\/code> as the primary key type for third party applications.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0441\u0451 \u0438\u0437 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0432\u0443\u0447\u0438\u0442 \u043a\u0430\u043a \u0447\u0435\u0440\u0442\u043e\u0432\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u044b\u0435 \u0432\u0435\u0449\u0438, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u044e \u043a\u0430\u043a \u0436\u0438\u043b \u0440\u0430\u043d\u044c\u0448\u0435, \u0431\u0443\u0434\u0443 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0437\u0434\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438 \u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 &#8212; \u0442\u0438\u043f\u0430, \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0448\u0442\u0443\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<blockquote>\n<p>If you\u2019re using \u201cRock \u2019n\u2019 roll\u201d in a project called anthology, but you want it to show up as \u201cJazz Manouche\u201d instead, you can provide your own configuration:<\/p>\n<\/blockquote>\n<pre><code class=\"python\"># anthology\/apps.py from rock_n_roll.apps import RockNRollConfig  class JazzManoucheConfig(RockNRollConfig):     verbose_name = \"Jazz Manouche\"  # anthology\/settings.py INSTALLED_APPS = [     'anthology.apps.JazzManoucheConfig',     # ... ]<\/code><\/pre>\n<p>\u042f \u0434\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u043b \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b: \u0445\u0430-\u0445\u0430, \u0437\u0430\u0445\u043e\u0447\u0443 \u0434\u0432\u0435 \u0430\u0434\u043c\u0438\u043d \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c &#8212; \u0442\u0443\u0442-\u0442\u043e \u043c\u043d\u0435 \u0438 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u044d\u0442\u0438 AppConfig, \u0431\u0430\u0445\u043d\u0443 \u0441\u0440\u0430\u0437\u0443 \u043f\u0430\u0440\u043e\u0447\u043a\u0443, \u043f\u043e\u043c\u0435\u043d\u044f\u044e \u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u0432\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0434\u0432\u0435 \u0430\u0434\u043c\u0438\u043d\u043a\u0438. \u041f\u043e\u0442\u043e\u043c \u043e\u0442\u043a\u0440\u044b\u043b <a href=\"https:\/\/www.webforefront.com\/django\/adminmultiplesites.html\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043d\u0443\u0430\u043b\u044b<\/a>, \u0430 \u0442\u0430\u043c \u044d\u0442\u0438 App Config \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u041d\u0443 \u043d\u0435 \u0437\u043d\u0430\u044e \u0442\u043e\u0433\u0434\u0430. \u041f\u043e\u0434\u0441\u043a\u0430\u0436\u0438\u0442\u0435, \u043a\u0442\u043e \u0432 \u0442\u0435\u043c\u0435.<\/p>\n<p>\u0410 \u0435\u0449\u0451 \u0431\u044b\u043b\u043e \u0431\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u0438\u043c\u0435\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u044f\u043c \u0432 \u044d\u0442\u0438\u0445 AppConfig, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u0432 settings.py. \u041d\u0443 \u0434\u0430, \u043d\u0443 \u0434\u0430, \u043f\u043e\u0448\u0451\u043b \u044f&#8230;<\/p>\n<h2>manage.py<\/h2>\n<h3>Commands<\/h3>\n<p>\u0412 \u0434\u0436\u0430\u043d\u0433\u043e \u0435\u0441\u0442\u044c \u0442.\u043d. management commands, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a CLI \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>.\/manage.py my_command<\/code>. \u0415\u0441\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c (\u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430), \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0441\u0434\u0435\u043b\u0430\u0432 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 &#171;thin management command&#187;:<\/p>\n<pre><code class=\"python\"># app\/management\/my_command.py from django.core.management.base import BaseCommand, CommandError from app.module import big_function_1000_lines_of_code  class Command(BaseCommand): def add_arguments(self, parser):         parser.add_argument('poll_ids', nargs='+', type=int)      def handle(self, *args, **options):         big_function_1000_lines_of_code(option['poll_ids'])<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0447\u0430\u0441\u0442\u044b\u0439 \u044e\u0437-\u043a\u0435\u0439\u0441. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b (\u043f\u043e\u043b\u0443)\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 management command. \u0412\u0438\u0434\u0438\u0442\u0435, \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u044f \u043a\u0430\u043a \u0434\u0443\u0440\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 <code>add_arguments<\/code>, \u0438 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u044e \u0432 <code>big_function_1000_lines_of_code<\/code>. \u041a\u043e\u0433\u0434\u0430 \u0442\u0430\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0441\u043a\u0430\u0436\u0435\u043c, 4, \u044d\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u0442\u044c.<\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0414\u0436\u0430\u043d\u0433\u043e \u043a\u0430\u043a-\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0432\u0430\u0441 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u0440\u044f\u043c \u0432 management command, \u0430 \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/ref\/django-admin\/#running-management-commands-from-your-code\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c management \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043f\u0440\u043c\u043e \u0438\u0437 \u043a\u043e\u0434\u0430<\/a>. \u0415\u0449\u0451 \u0440\u0430\u0437: \u043a\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 CLI \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0434.<\/p>\n<h3>Overriding commands<\/h3>\n<p>\u041a\u0430\u043a-\u0442\u043e \u043d\u043e\u0447\u044c\u044e \u044f \u043d\u0435 \u0441\u043f\u0430\u043b, \u0434\u0443\u043c\u0430\u043b \u043e \u0432\u0435\u043b\u0438\u043a\u043e\u043c, \u0438 \u0442\u0443\u0442 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0430 \u0438\u0434\u0435\u044f: \u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0443 \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0414\u0436\u0430\u043d\u0433\u043e? \u041d\u0443 \u0442\u0430\u043c \u043d\u0430\u043f\u0438\u0448\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, <em>\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442, \u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u043e\u043c\u0430\u043d\u0434\u0443 collectstatic<\/em>. \u0427\u0442\u043e\u0431 \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043b\u0438: <code>.\/manage.py collectstatic<\/code> \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u044f\u043a\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, js \u0438 css \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u043a\u043b\u0430\u0434\u0451\u0442 \u0438\u0445 \u0432 \u043e\u0434\u043d\u043e \u043c\u0435\u0441\u0442\u043e &#8212; \u043b\u0438\u0431\u043e \u0432 \u043f\u0430\u043f\u043a\u0443, \u043b\u0438\u0431\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 s3, \u0438, \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0434\u0436\u0430\u043d\u0433\u043e-\u043f\u0440\u043e\u0435\u043a\u0442\u044b \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 (\u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0434\u043b\u044f \u0434\u0436\u0430\u043d\u0433\u043e-\u0430\u0434\u043c\u0438\u043d\u043a\u0438 \u043d\u0443\u0436\u043d\u044b \u044d\u0442\u0438 \u0441\u0430\u043c\u044b\u0435 js \u0438 css). \u0422\u043e \u0435\u0441\u0442\u044c <code>collectstatic<\/code> \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0434\u0435\u043f\u043b\u043e\u0435.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u044f \u043f\u0438\u0448\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u044d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0441\u0432\u043e\u0439 payload:<\/p>\n<pre><code class=\"python\">from django.core.management.base import BaseCommand from django.core import management from django.contrib.staticfiles.management.commands.collectstatic import Command as OriginalCommand  class Command(BaseCommand):     def handle(self, *args, **options):         management.call_command(OriginalCommand())         self.stdout.write(self.style.SUCCESS('\u0412\u044b \u043b\u043e\u0445'))<\/code><\/pre>\n<pre><code class=\"bash\">(venv) src (master) [1]> .\/manage.py collectstatic  You have requested to collect static files at the destination location as specified in your settings:      \/home\/user\/workspace\/app\/src\/static  This will overwrite existing files! Are you sure you want to do this?  Type 'yes' to continue, or 'no' to cancel: yes  0 static files copied to '\/home\/user\/workspace\/app\/static', 160 unmodified. \u0412\u044b \u043b\u043e\u0445<\/code><\/pre>\n<p>\u0412\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u0431\u0435\u0437 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u043c\u043e\u0451 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 &#8212; \u0432\u0435\u0434\u044c payload \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 CLI \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435.<\/p>\n<p>\u0421\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u0440\u0430\u0434\u0438 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/howto\/custom-management-commands\/#overriding-commands\" rel=\"noopener noreferrer nofollow\">\u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c<\/a> \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043c\u043e\u0451 \u0437\u043b\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <em>\u043f\u0435\u0440\u0435\u0434<\/em> \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c &#8212; \u043d\u0443 \u0442\u0438\u043f\u0430 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">INSTALLED_APPS = [     'my_evil_app',     # ...     'django.contrib.staticfiles',     # ...<\/code><\/pre>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0432 README \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438, \u0438 \u0434\u0435\u043b\u043e \u043f\u0443\u0447\u043a\u043e\u043c. \u0414\u0436\u0430\u043d\u0433\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u0435\u0442 \u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0438 \u0432\u0441\u0451. \u042f \u0441\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0434\u0443\u0440\u0430\u0447\u043e\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0447\u0442\u0430\u044e, \u0447\u0442\u043e\u0431\u044b \u043b\u044e\u0431\u0430\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u043b\u0430\u0441\u044c \u043a\u0430\u043a-\u0442\u043e \u044f\u0432\u043d\u043e (<code>.\/manage.py my_evil_app.collectstatic<\/code> \u0438 <code>.\/manage.py staticfiles.collectstatic<\/code>), \u0430 \u043f\u0440\u0438 <code>.\/manage.py collectstatic<\/code> \u043e\u043d\u043e \u0431\u044b \u043f\u0430\u0434\u0430\u043b\u043e \u0438\u043b\u0438 \u0440\u0443\u0433\u0430\u043b\u043e\u0441\u044c &#8212; \u043d\u043e \u044d\u0442\u043e \u044f. \u041e\u043a\u0435\u0439, \u0414\u0436\u0430\u043d\u0433\u043e, \u0442\u0435\u0431\u0435 \u0432\u0438\u0434\u043d\u0435\u0435.<\/p>\n<h2>URLs<\/h2>\n<h3>Path vs pattern<\/h3>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c path-style:<\/p>\n<pre><code class=\"python\">path('articles\/&lt;int:year>\/&lt;int:month>\/&lt;slug:slug>\/', views.article_detail),<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e regex-style:<\/p>\n<pre><code class=\"python\">re_path(r'^articles\/(?P&lt;year>[0-9]{4})\/(?P&lt;month>[0-9]{2})\/(?P&lt;slug>[\\w-]+)\/$', ...)<\/code><\/pre>\n<p>\u041d\u0443 \u0434\u043b\u044f \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438.<\/p>\n<h3>APPEND_SLASH<\/h3>\n<p>\u0412\u0440\u043e\u0434\u0435 \u043a\u0430\u043a \u0443\u0434\u043e\u0431\u043d\u043e &#8212; \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0441\u0442\u0430\u0432\u044f\u0442 <code>\/<\/code> \u0432 \u043a\u043e\u043d\u0446\u0435 URL, \u0438 \u043f\u0440\u0438 <code>APPEND_SLASH = True<\/code> \u0434\u0436\u0430\u043d\u0433\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430 \u043d\u0438\u0445. \u0410 \u043f\u043e\u0442\u043e\u043c \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0432\u044b \u0443\u0437\u043d\u0430\u0451\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 <code>POST<\/code>. \u0418 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442: \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442 POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0435\u0437 \u0441\u043b\u044d\u0448\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435, \u0442\u043e \u043e\u043a\u0435\u0439, \u0434\u0436\u0430\u043d\u0433\u043e, \u0442\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0448\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442, \u0442\u0430\u043a \u043d\u0430\u043f\u0438\u0448\u0438 \u043a\u0430\u043a \u0435\u0441\u0442\u044c: URL \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, 404 \u043e\u0448\u0438\u0431\u043a\u0430. \u041d\u043e \u0437\u043d\u0430\u0435\u0442\u0435 \u0447\u0442\u043e? \u0414\u0436\u0430\u043d\u0433\u043e \u043f\u0430\u0434\u0430\u0435\u0442 \u0441 500 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0438 <code>RuntimeError<\/code>, \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442: &#171;\u0437\u043d\u0430\u0435\u0448\u044c, \u044f \u043e\u0431\u043b\u0430\u0436\u0430\u043b\u0441\u044f, \u0435\u0441\u043b\u0438 \u0442\u044b \u043d\u0435 \u0445\u043e\u0447\u0435\u0448\u044c, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043b\u043e\u0441\u044c &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0438 <code>APPEND_SLASH<\/code>&#171;.<\/p>\n<pre><code>Django version 3.2.8, using settings 'project.settings' Starting development server at http:\/\/127.0.0.1:8000\/ Quit the server with CONTROL-C. ERROR 2021-11-24 14:40:10,234 django.request Internal Server Error: \/api\/auth\/login Traceback (most recent call last):   File \"\/home\/user\/workspace\/...\/venv\/lib\/python3.9\/site-packages\/django\/core\/handlers\/exception.py\", line 47, in inner     response = get_response(request)   File \"\/home\/user\/workspace\/...\/venv\/lib\/python3.9\/site-packages\/django\/utils\/deprecation.py\", line 116, in __call__     response = self.process_request(request)   File \"\/home\/user\/workspace\/...\/venv\/lib\/python3.9\/site-packages\/django\/middleware\/common.py\", line 54, in process_request     path = self.get_full_path_with_slash(request)   File \"\/home\/user\/workspace\/...\/venv\/lib\/python3.9\/site-packages\/django\/middleware\/common.py\", line 88, in get_full_path_with_slash     raise RuntimeError( RuntimeError: You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to 127.0.0.1:8000\/api\/auth\/login\/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.<\/code><\/pre>\n<h3>Static \/ media<\/h3>\n<p>\u0420\u0443\u0431\u0440\u0438\u043a\u0430 &#171;\u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f&#187;:<\/p>\n<p>Static files:<\/p>\n<ul>\n<li>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0430\u0439\u043b\u044b<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u043e\u0442\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0430 \u043d\u0435 \u0441\u0430\u043c\u0438\u043c \u0434\u0436\u0430\u043d\u0433\u043e<\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u0414\u0436\u0430\u043d\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 DEBUG=True<\/p>\n<\/li>\n<\/ul>\n<p>Media files:<\/p>\n<ul>\n<li>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0430\u0439\u043b\u044b<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u043e\u0442\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0430 \u043d\u0435 \u0441\u0430\u043c\u0438\u043c \u0434\u0436\u0430\u043d\u0433\u043e<\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043e\u0442\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u0414\u0436\u0430\u043d\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 DEBUG=True<\/p>\n<\/li>\n<\/ul>\n<h2>Views<\/h2>\n<h3>as_view() as_view() as_view() as_view() as_view()<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0435 CBV \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e url, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u0442\u044c as_view(), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u0436\u0430\u043d\u0433\u043e \u0441\u0430\u043c\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442:<\/p>\n<pre><code class=\"python\">urlpatterns = [     path('properties\/', PropertyListView.as_view()),     path('properties\/&lt;int:pk>\/', PropertyDetailView.as_view()),     path('listings\/&lt;int:pk>\/', ListingDetailView.as_view()),     path('listings\/&lt;int:pk>\/do\/', DoView.as_view(), name='do-listing'),     path('do\/', DoView.as_view(), name='do'),     path('model\/&lt;int:model_version>\/', ModelView.as_view(), name='model'), ]<\/code><\/pre>\n<h3>MVT, fuck you!<\/h3>\n<p>Urlpatterns &#8212; \u0444\u0430\u0439\u043b, \u0433\u0434\u0435 \u0432\u044b \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0435 \u0432\u0441\u0435 url \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u043d\u0438\u0447\u0435\u0433\u043e. \u041d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043b\u0430\u0431\u0438\u0442\u044c\u0441\u044f, \u043f\u043b\u044e\u043d\u0443\u0442\u044c \u043d\u0430 MVT \u0438 <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/topics\/class-based-views\/#usage-in-your-urlconf\" rel=\"noopener noreferrer nofollow\">\u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u044f\u043c\u043e \u0432 urlpatterns<\/a>. \u0412\u0435\u0434\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043d\u0430\u0440\u0443\u0448\u0430\u0442\u044c!<\/p>\n<pre><code class=\"python\">urlpatterns = [     path('about\/', TemplateView.as_view(template_name=\"about.html\")), ]<\/code><\/pre>\n<h3>\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b + CBV = ?<\/h3>\n<p><a href=\"https:\/\/docs.djangoproject.com\/en\/dev\/topics\/class-based-views\/intro\/#decorating-class-based-views\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0438 \u0437\u0430\u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c CBV.<\/a> \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u0434\u0436\u0430\u043d\u0433\u043e \u0441\u043e\u0432\u0435\u0442\u0443\u044e\u0442 \u0437\u0430\u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c view <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/topics\/class-based-views\/intro\/#decorating-in-urlconf\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u044f\u043c\u043e \u0432 urlconf<\/a>. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u043f\u0443\u043d\u043a\u0442 \u0432\u044b\u0448\u0435 \u043f\u0440\u043e MVT \u0438 \u0432\u044b \u043f\u0440\u044f\u043c \u0441\u043e\u0432\u0441\u0435\u043c \u0448\u0430\u043b\u0443\u043d, \u0442\u043e \u044d\u0442\u043e\u0442 \u0441\u043d\u0438\u043f\u043f\u0435\u0442 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0432\u0430\u0441:<\/p>\n<pre><code class=\"python\">urlpatterns = [     path('about\/', login_required(TemplateView.as_view(template_name=\"secret.html\"))),     path('vote\/', permission_required('polls.can_vote')(VoteView.as_view())), ]<\/code><\/pre>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0448\u0430\u043b\u0443\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0441\u0442\u044b\u043b\u044c:<\/p>\n<pre><code class=\"python\">@method_decorator(never_cache, name='dispatch') @method_decorator(login_required, name='dispatch') class ProtectedView(TemplateView):     template_name = 'secret.html'<\/code><\/pre>\n<h2>\u0412\u044b\u0432\u043e\u0434<\/h2>\n<p>\u0414\u0436\u0430\u043d\u0433\u043e \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0430 5 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0440\u0430\u043a\u0435\u0442\u0443 \u0438 \u0443\u043b\u0435\u0442\u0435\u0442\u044c \u0432 \u043a\u043e\u0441\u043c\u043e\u0441 &#8212; \u0447\u0442\u043e \u044f \u0438 \u0434\u0435\u043b\u0430\u044e \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u043e\u0442 \u0443\u0436\u0435 \u043b\u0435\u0442 10 &#8212; \u043d\u043e \u043e\u043d \u043c\u043d\u0435 \u043f\u043e\u0440\u043e\u0439 \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u0414\u0430, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, <em>\u0432\u0441\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0440\u0435\u0448\u0430\u0435\u043c\u044b<\/em> &#8212; \u0442\u0430\u043c \u043f\u0430\u043a\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0442\u0443\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0437\u0431\u0435\u0433\u0430\u0435\u0448\u044c \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0432\u0435\u0449\u0435\u0439 &#8212; \u0438 \u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430\u0434\u043e.<\/p>\n<p>\u041d\u043e \u043f\u0440\u0435\u0442\u0435\u043d\u0437\u0438\u0438 \u0434\u0432\u0435:<\/p>\n<ol>\n<li>\n<p>&#171;Django. Batteries included&#187; &#8212; \u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a, \u043d\u043e \u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0438-\u0442\u043e \u0438\u0437 FixPrice \u0438 \u043d\u0430\u0434\u043e\u043b\u0433\u043e \u0438\u0445 \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0444\u043b\u0430\u0441\u043a\u0430, \u0433\u0434\u0435 &#171;\u0441\u043e\u0431\u0435\u0440\u0438 \u0432\u0441\u0451 \u0441\u0430\u043c&#187;, \u0432 \u0414\u0436\u0430\u043d\u0433\u043e \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u044f \u0442\u0438\u043f\u0430 &#171;\u043e\u043d\u043e \u0443\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442&#187;, \u043d\u043e \u0447\u0430\u0441\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043d\u0435 \u0442\u043e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0434\u0438\u0447\u044c, \u043f\u0438\u0448\u0443\u0442 \u043e \u043d\u0435\u0439 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0438\u0437-\u0437\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0414\u0436\u0430\u043d\u0433\u043e \u0442\u0443\u0434\u0430 \u043d\u0430\u0431\u0435\u0433\u0430\u0435\u0442 \u043a\u0443\u0447\u0430 \u043d\u0430\u0440\u043e\u0434\u0443 \u0438 \u0432\u0441\u0435 \u043e\u043d\u0438 \u0434\u0443\u043c\u0430\u044e\u0442, \u0447\u0442\u043e \u0442\u0430\u043a \u0438 \u043d\u0430\u0434\u043e, \u0438 \u0442\u0430\u043a \u0438 \u043f\u0438\u0448\u0443\u0442. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0414\u0436\u0430\u043d\u0433\u043e &#8212; \u044d\u0442\u043e \u043d\u0435 best practices, \u0438 \u0441\u0432\u043e\u044f \u0433\u043e\u043b\u043e\u0432\u0430 \u043d\u0430 \u043f\u043b\u0435\u0447\u0430\u0445 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043e\u0447\u0435\u043d\u044c \u043d\u0443\u0436\u043d\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0441 \u044d\u0442\u0438\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u0430\u044f, \u043d\u043e \u044f \u043d\u0435 \u0414\u0438\u041a\u0430\u043f\u0440\u0438\u043e \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u043a\u0430\u043a \u043e\u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/645\/bde\/c34\/645bdec34654841deea062b289998505.jpg\" width=\"825\" height=\"527\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/645\/bde\/c34\/645bdec34654841deea062b289998505.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0436\u0430\u043d\u0433\u043e &#8212; \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u0441\u043b\u043e\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0434\u0451\u0442 \u043a\u0443\u0434\u0430-\u0442\u043e \u0441\u0432\u043e\u0435\u0439 \u0434\u043e\u0440\u043e\u0433\u043e\u0439, \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u044b \u043d\u0435 \u0432\u044f\u043a\u0430\u0439, \u0435\u0433\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u043e\u043b\u043d\u0443\u0435\u0442. \u0427\u0442\u043e-\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432 \u043d\u0451\u043c &#8212; \u043d\u0435\u0440\u0435\u0430\u043b\u044c\u043d\u043e, \u0430 \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442 \u043d\u0435\u043f\u0440\u0438\u043d\u044f\u0442\u043e\u0433\u043e merge request \u0431\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u0440\u0438\u0442 \u043f\u043e \u0441\u0430\u043c\u043e\u043b\u044e\u0431\u0438\u044e. \u042f \u043d\u0435 \u043c\u043e\u0433\u0443 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0414\u0436\u0430\u043d\u0433\u043e, \u043d\u043e \u043c\u043e\u0433\u0443 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0435\u0431\u044f &#8212; \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043b\u0443\u0447\u0448\u0435 \u043a\u043e\u0434\u0438\u0442\u044c \u0438 \u0441\u043a\u0435\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0432\u0435\u0449\u0438.<\/p>\n<p>\u0410 \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e! \u0415\u0439-\u0431\u043e\u0433\u0443, \u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b, \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u043f\u0430\u0440\u0443 \u043c\u0435\u0441\u044f\u0446\u0435\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0451 \u044d\u0442\u043e &#8212; \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u043e\u0436\u0438\u0439 \u0434\u0435\u043d\u044c \u044f \u043d\u0430\u0445\u043e\u0434\u0438\u043b \u0447\u0442\u043e-\u0442\u043e, \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u043f\u0440\u043e \u0441\u0435\u0431\u044f &#171;\u043e\u043a\u0435\u0439, \u0414\u0436\u0430\u043d\u0433\u043e&#187; \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b \u0441\u044e\u0434\u0430 &#8212; \u0438 \u044f \u0442\u043e\u0447\u043d\u043e \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0435\u0449\u0451 \u043d\u0435\u043c\u0430\u043b\u043e \u043f\u0443\u043d\u043a\u0442\u043e\u0432. \u041d\u0443 \u0438 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 &#171;\u043f\u0443\u043d\u043a\u0442\u044b&#187; \u043f\u043e \u0414\u0436\u0430\u043d\u0433\u043e, \u0438\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 (\u044f) \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435 \u043f\u0440\u0430\u0432 &#8212; \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0445!<\/p>\n<p>\u0418 \u043a\u0441\u0442\u0430\u0442\u0438, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u044f \u043f\u0438\u0448\u0443, \u0442\u043e \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u044e \u0432\u0430\u0441 \u043a \u0441\u0435\u0431\u0435 \u0432 <a href=\"https:\/\/t.me\/blog_pogromista\" rel=\"noopener noreferrer nofollow\">\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u043a\u0430\u043d\u0430\u043b<\/a>: \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u043e\u0447\u043a\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0435 \u043f\u043e\u0434 \u0444\u043e\u0440\u043c\u0430\u0442 \u0445\u0430\u0431\u0440\u0430, \u0430 \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445 &#8212; \u0438 \u044d\u0442\u043e \u0435\u0433\u043e \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e &#8212; \u0442\u0430\u043c \u043d\u0435 \u043f\u0438\u0448\u0435\u0442 <a href=\"https:\/\/habr.com\/ru\/users\/hetmansoftware\/posts\/\" rel=\"noopener noreferrer nofollow\">Hetman software<\/a>. \u0414\u0430, <a class=\"mention\" href=\"\/users\/deniskin\">@deniskin<\/a> \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/594601\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u041a\u0430\u043a\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043c\u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u043a \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">16.27% <\/span><span class=\"tm-article-poll__answer-label\">\u0422\u044b \u0436\u0435 \u0435\u0433\u043e \u0443\u0436\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b<\/span><span class=\"tm-article-poll__answer-votes\">41<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 16.27%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">23.02% <\/span><span class=\"tm-article-poll__answer-label\">\u00ab\u041a\u0430\u043a\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043c\u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u043a \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435?\u00bb<\/span><span class=\"tm-article-poll__answer-votes\">58<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 23.02%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">5.56% <\/span><span class=\"tm-article-poll__answer-label\">\u041b\u044e\u0431\u043e\u0439<\/span><span class=\"tm-article-poll__answer-votes\">14<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 5.56%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">7.14% <\/span><span class=\"tm-article-poll__answer-label\">\u041d\u0438\u043a\u0430\u043a\u043e\u0439<\/span><span class=\"tm-article-poll__answer-votes\">18<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 7.14%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">48.02% <\/span><span class=\"tm-article-poll__answer-label\">\u00ab\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0434\u043b\u044f IT-\u0448\u043d\u0438\u043a\u043e\u0432 \u043d\u0435\u0449\u0430\u0434\u043d\u043e \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442 WYSIWYG \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440?\u00bb<\/span><span class=\"tm-article-poll__answer-votes\">121<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 48.02%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 252 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.    \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0441\u044f 71 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/594601\/\"> https:\/\/habr.com\/ru\/articles\/594601\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e, \u0438 \u043c\u0435\u043d\u044f \u0441\u043f\u0440\u043e\u0441\u0438\u043b\u0438, \u043f\u0438\u0448\u0443 \u043b\u0438 \u044f \u043d\u0430 flask, \u043d\u0430 \u0447\u0442\u043e \u044f \u043e\u0442\u0432\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u044f \u0441\u0435\u0431\u044f \u043b\u044e\u0431\u043b\u044e, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0438\u0448\u0443 \u043d\u0430 django. \u041c\u0435\u043d\u044f \u043d\u0435 \u0432\u0437\u044f\u043b\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e, \u043a\u0445\u043c, \u0443 \u043d\u0438\u0445, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0431\u044b\u043b\u043e \u043d\u0430 \u0444\u043b\u0430\u0441\u043a\u0435, \u0438 \u0432\u044b\u0448\u043b\u043e \u043d\u0435\u043b\u043e\u0432\u043a\u043e. \u0414\u0430-\u0434\u0430, \u044f \u0437\u043d\u0430\u044e, \u0444\u043b\u0430\u0441\u043a \u043a\u0440\u0443\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0432\u0441\u0451 \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0442\u0430\u0432\u0438\u0448\u044c \u0441\u0430\u043c, \u0430 \u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u0442\u0430\u043c \u0438 \u0442\u0430\u043a \u043d\u0435\u0442, \u043d\u043e \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f django.<\/p>\n<p>\u0418 \u0442\u0443\u0442, \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044f \u044f \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c \u0414\u0436\u0430\u043d\u0433\u043e, \u0445\u043e\u0436\u0443 \u043f\u043e \u0434\u043e\u043c\u0430\u043c, \u0441\u0442\u0443\u0447\u0443 \u0432 \u0434\u0432\u0435\u0440\u0438 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e, \u043a\u0430\u043a \u043a\u0440\u0443\u0442\u043e \u043d\u0430 \u043d\u0451\u043c \u043a\u043e\u0434\u0438\u0442\u044c, \u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u043d\u0435\u0442 &#8212; \u0414\u0436\u0430\u043d\u0433\u043e \u0442\u043e\u0436\u0435 \u043d\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c&#8230; \u0412\u043e\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u044f \u0438 \u0445\u043e\u0447\u0443 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c.<\/p>\n<h2>Async<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u043e\u0442 \u0442\u0430\u043a: \u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0435\u043c\u0443 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 &#171;\u0432 \u0414\u0436\u0430\u043d\u0433\u043e 3.0 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438&#187;? \u041d\u0443 \u043a\u0430\u043a, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u041f\u0435\u0442\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443, \u0432\u043e\u0440\u043a\u0435\u0440 \u043f\u0440\u0438\u043d\u044f\u043b \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043d\u0443\u043b \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u0441\u0432\u043e\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u044b\u0433\u0430\u0435\u0442 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0443\u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442 \u0412\u0430\u0441\u0438, \u043f\u0438\u043d\u0430\u0435\u0442 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u0441\u0432\u043e\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043f\u0440\u044b\u0433\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a \u041f\u0435\u0442\u0435&#8230; \u041d\u0443 \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438.<\/p>\n<p>\u0422\u0430\u043a-\u0442\u043e \u043e\u043d\u043e \u0442\u0430\u043a, \u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0438 \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u0442\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c: \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043d\u0438\u0445\u0440\u0435\u043d\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041f\u043e\u0447\u0435\u043c\u0443? \u041d\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 django ORM \u0432\u0441\u0451 \u0435\u0449\u0451 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f:<\/p>\n<blockquote>\n<p>We\u2019re still working on async support for the ORM and other parts of Django. You can expect to see this in future releases. For now, you can use the <code>sync_to_async()<\/code> adapter to interact with the sync parts of Django.<\/p>\n<\/blockquote>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u0432\u0430\u043c \u043c\u0430\u043b\u043e, \u0442\u043e \u0432\u043e\u0442 \u0435\u0449\u0451: \u043d\u0435 \u0432\u0441\u0435 middleware \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 async. \u041a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0414\u0436\u0430\u043d\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0432\u0438\u0434\u0435 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f:<\/p>\n<blockquote>\n<p>Middleware can be built to support <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/topics\/http\/middleware\/#async-middleware\" rel=\"noopener noreferrer nofollow\">both sync and async<\/a> contexts. Some of Django\u2019s middleware is built like this, but not all. To see what middleware Django has to adapt, you can turn on debug logging for the <code>django.request<\/code> logger and look for log messages about <em>\u201cSynchronous middleware \u2026 adapted\u201d<\/em>.<\/p>\n<\/blockquote>\n<p>\u041d\u0443 \u044f \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b, \u043c\u043d\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0432\u0435\u043b\u043e\u0441\u044c. \u0412\u043e\u0442 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0447\u0435\u043b &#8212; \u0443 \u043d\u0435\u0433\u043e <a href=\"https:\/\/stackoverflow.com\/questions\/66471951\/how-can-i-check-which-django-middleware-is-synchronous-or-asynchronous\" rel=\"noopener noreferrer nofollow\">\u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c<\/a>. \u0417\u043d\u0430\u0447\u0438\u0442, \u0432\u0441\u0435 middleware \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435? \u041d\u0443 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e&#8230;<\/p>\n<p>\u041d\u043e \u0438 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0432\u0441\u0451! \u042f \u0434\u0430\u0436\u0435 \u0431\u043e\u044e\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0442\u0430\u0440\u0435\u0435\u043a \u0432\u0441\u0451 \u0435\u0449\u0451 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438. \u041d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e <code>pip install django-whatever<\/code> \u0438 \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 async.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e async django &#8212; \u044d\u0442\u043e \u0445\u043e\u0434\u044c\u0431\u0430 \u043f\u043e \u043c\u0438\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044e: \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435\u0441\u044c \u0432 &#171;async scope&#187;, \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u043c \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u043d\u0435\u0432\u0430\u0436\u043d\u043e \u0433\u0434\u0435 &#8212; \u0432 middleware, \u0438\u043b\u0438 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0411\u0414, \u0438\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0430 \u044e\u0437\u0430\u0435\u0442 requests, \u0430 \u043d\u0435 httpx &#8212; \u0442\u043e \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c, \u0438\u043b\u0438 \u043e\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0441 \u043f\u043e\u0442\u0435\u0440\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u042f \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442 &#8212; \u043c\u043d\u0435 \u0432\u0441\u0451 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0445\u0440\u0435\u043d\u0430\u043a-\u0445\u0440\u0435\u043d\u0430\u043a, \u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432. \u041d\u043e \u0442\u0443\u0442 \u0434\u0430\u0436\u0435 \u044f \u043f\u0430\u0441\u0443\u044e \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0447\u0430\u0441\u043e\u0432, \u043d\u0443\u0436\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0414\u0436\u0430\u043d\u0433\u043e \u043d\u0430 async.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/topics\/async\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0430\u043c\u0438<\/a>, \u043a\u0430\u043a \u0414\u0436\u0430\u043d\u0433\u043e \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u0434\u0432\u0443\u0445 \u0441\u0442\u0443\u043b\u044c\u044f\u0445 &#8212; sync \u0438 async &#8212; \u043d\u043e \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442, \u0447\u0442\u043e \u0414\u0436\u0430\u043d\u0433\u043e \u0442\u0430\u043a \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c, \u043e\u0442\u0434\u0430\u0432\u0430\u044f async \u0432 \u0440\u0443\u043a\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432.<\/p>\n<h2>\u0411\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0438<\/h2>\n<p>\u0414\u0436\u0430\u043d\u0433\u043e \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442 \u0441\u0432\u043e\u0438\u043c\u0438 \u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0430\u043c\u0438. \u0412\u043e\u0437\u044c\u043c\u0438\u0442\u0435 \u0441\u0432\u043e\u044e \u0441\u0430\u043c\u0443\u044e \u0431\u0435\u0437\u0443\u043c\u043d\u0443\u044e \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u044e, \u0438 \u0434\u043b\u044f \u043d\u0435\u0451 \u043d\u0430\u0439\u0434\u0451\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0414\u0436\u0430\u043d\u0433\u043e. \u0425\u043e\u0441\u043f\u0430\u0434\u0435, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0432\u0441\u0451, \u0434\u0430\u0436\u0435 <a href=\"http:\/\/whitenoise.evans.io\/en\/stable\/\" rel=\"noopener noreferrer nofollow\">whitenoise<\/a> \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u043b\u0435\u043d\u044c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c nginx.<\/p>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u0436\u0435 Django \u0435\u0441\u0442\u044c \u0442.\u043d. <code>django.contrib<\/code> \u043f\u0430\u043f\u043a\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u0443\u0447\u0430 \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0438 \u043d\u0435\u0442\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<h3>Sites framework<\/h3>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0445\u043e\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u0439\u0442\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438.<\/p>\n<p>\u0418 \u043b\u0430\u0434\u043d\u043e \u0431\u044b \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 &#8212; \u043d\u0443 \u0442\u0430\u043c \u0443 \u0432\u0430\u0441 \u043c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u043e\u0432 \u0438 \u0432\u044b \u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0435 \u043f\u043e <code>SITE_ID<\/code> \u0432 <code>settings.py<\/code> (\u0447\u0442\u043e \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u044f \u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u043b \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u043c\u0443 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443, \u0442\u0438\u043f\u0430 <code>kuku.com<\/code> \u0438 <code>haha.net<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e &#171;database ID&#187;, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f <code>SITE_ID<\/code>, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445). \u041d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435, \u0442\u043e <strong>\u0434\u0436\u0430\u043d\u0433\u043e \u0441\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0432\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/ref\/contrib\/sites\/#how-django-uses-the-sites-framework\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a> <em>\u0442\u0440\u0435\u0431\u0443\u044e\u0442<\/em> \u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0423\u0440\u0430, \u0441\u043f\u0430\u0441\u0438\u0431\u043e.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0445\u043e\u0445\u043c\u0430 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438:<\/p>\n<blockquote>\n<p>You can use the sites framework in your Django views to do particular things based on the site in which the view is being called. For example:<\/p>\n<\/blockquote>\n<pre><code class=\"python\">from django.conf import settings  def my_view(request):     if settings.SITE_ID == 3:         # Do something.         pass     else:         # Do something else.         pass<\/code><\/pre>\n<p>\u042f \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u0440\u044b\u043b \u0440\u043e\u0442, \u0447\u0442\u043e \u0442\u0443\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Magic_number_(programming)\" rel=\"noopener noreferrer nofollow\">magic number<\/a>, \u043d\u043e \u0414\u0436\u0430\u043d\u0433\u043e \u043c\u0435\u043d\u044f \u043e\u043f\u0435\u0440\u0435\u0434\u0438\u043b:<\/p>\n<blockquote>\n<p>It\u2019s fragile to hard-code the site IDs like that, in case they change. The cleaner way of accomplishing the same thing is to check the current site\u2019s domain:<\/p>\n<\/blockquote>\n<pre><code class=\"python\">from django.contrib.sites.shortcuts import get_current_site  def my_view(request):     current_site = get_current_site(request)     if current_site.domain == 'foo.com':         # Do something         pass     else:         # Do something else.         pass<\/code><\/pre>\n<p>\u0410, \u043d\u0435\u0442, \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e &#171;magic number&#187; \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u043d\u0430 &#171;hardcoded value&#187; (\uff0d\u2038\u10da)<\/p>\n<h3>Env vars<\/h3>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f &#8212; \u044d\u0442\u043e \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 django \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e, \u0438 \u043e\u043d \u0432\u0430\u0441 \u0443\u0447\u0438\u0442 \u0438\u0445 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c &#8212; \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<h3>Tests<\/h3>\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0441\u0442\u044c pytest &#8212; \u0443\u0434\u043e\u0431\u043d\u043e, \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0433\u0438\u0431\u043a\u043e. \u041d\u043e \u043c\u0430\u043b\u043e \u043a\u0442\u043e \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0443 pytest \u0435\u0441\u0442\u044c <a href=\"https:\/\/lurkmore.to\/%D0%A4%D0%B0%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BE%D0%BA\" rel=\"noopener noreferrer nofollow\">\u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a<\/a>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0434\u0436\u0430\u043d\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, <a href=\"https:\/\/www.reddit.com\/r\/django\/comments\/jcbrh5\/django_testing_vs_pytestdjango\/\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435<\/a>, <a href=\"https:\/\/stackoverflow.com\/questions\/44558018\/django-test-vs-pytest\" rel=\"noopener noreferrer nofollow\">\u0445\u0443\u0436\u0435<\/a>.<\/p>\n<h3>\u041e\u0442\u043b\u0430\u0434\u043a\u0430<\/h3>\n<h4>\u041e\u0442\u0447\u0451\u0442\u044b<\/h4>\n<p>\u0414\u0436\u0430\u043d\u0433\u043e \u043f\u0438\u0448\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u043e\u0442\u0447\u0451\u0442\u044b \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445. \u041d\u043e \u043d\u0435 \u0434\u0430\u0439 \u0431\u043e\u0433 \u0443 \u0432\u0430\u0441 \u043d\u0435 500 internal server error, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442.  \u0418 \u0445\u043e\u0442\u044f \u0432\u043e\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u0440\u044f\u0434\u043e\u043c \u043b\u0435\u0436\u0438\u0442 <a href=\"https:\/\/django-debug-toolbar.readthedocs.io\/en\/latest\/\" rel=\"noopener noreferrer nofollow\">django-debug-toolbar<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0411\u0414 \u0441 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0430\u043c\u0438!), \u0432 Django \u043e\u043d\u043e \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e&#8230; \u043d\u0443 \u043d\u0435 \u0437\u043d\u0430\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0432\u0430\u0436\u043d\u043e, \u043a\u0430\u043a sites framework.<\/p>\n<p>\u041d\u043e \u0432\u043e\u0442 \u0438 500\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0436\u0430\u043d\u0433\u043e \u043a\u0430\u043a \u0431\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u0442: &#171;\u044d\u0439, \u0447\u0435\u043b, \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u043e\u043b\u044f, \u0442\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0448\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0447\u0438\u0441\u043b\u043e, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435&#8230;&#187;<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h4>Error reports<\/h4>\n<p>\u0411\u0435\u0437 \u0441\u0430\u0440\u043a\u0430\u0437\u043c\u0430, \u0438\u0434\u0435\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0430 email \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 &#8212; \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e! \u042d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0435\u0449\u0451 \u043d\u0435 \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0435\u043d. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430: \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u041d\u0435 \u0434\u0430\u0439 \u0431\u043e\u0433 \u0432\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0435\u0451 &#8212; \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u0430\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 \u043f\u0438\u0441\u044c\u043c\u043e \u043d\u0430 \u043f\u043e\u0447\u0442\u0443, \u0438 \u0441\u043a\u043e\u0440\u043e \u0432\u0430\u0448 \u044f\u0449\u0438\u043a \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u043f\u043e\u043c\u043e\u0439\u043a\u0443.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u0430\u0441 \u043f\u043e\u0440\u0430\u0434\u043e\u0432\u0430\u043b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0414\u0436\u0430\u043d\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e invalid host header &#8212; \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435  <code>header Host: xxx.com<\/code> \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u0434\u043e\u043c\u0435\u043d\u0443 \u0438\u0437 <code>ALLOWED_HOSTS<\/code> &#8212; \u0432\u044b\u0437\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 500. \u041b\u043e\u0433\u0438\u043a\u0430, \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u0442\u0430\u043a\u0430\u044f: \u0440\u0430\u0437 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0445\u0440\u0435\u043d \u0441 \u0433\u043e\u0440\u044b \u0443\u043a\u0430\u0437\u0430\u043b \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0442\u043e \u0432\u0430\u0448 \u0441\u0430\u0439\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043f\u0430\u0441\u0442\u044c, \u0430 \u0430\u0434\u043c\u0438\u043d\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u0438\u0439\u0442\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435. \u041d\u0435\u043f\u043b\u043e\u0445\u043e, \u0414\u0436\u0430\u043d\u0433\u043e!<\/p>\n<p>\u0412\u043e\u0442 \u043c\u043e\u044f \u043f\u043e\u0447\u0442\u0430:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>Syndication framework (RSS \/ atom feeds)<\/h3>\n<p>\u041d\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439. \u041d\u0435 fingerprinting. \u041d\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \/ \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043d\u0435\u0442. <strong>\u0412\u0430\u043c \u043d\u0443\u0436\u0435\u043d <\/strong><a href=\"https:\/\/docs.djangoproject.com\/en\/3.2\/ref\/contrib\/syndication\/\" rel=\"noopener noreferrer nofollow\"><strong>RSS<\/strong><\/a><strong>!!<\/strong><\/p>\n<h3>Sessions<\/h3>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0446\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c?<\/p>\n<blockquote>\n<p>\u0412 \u0414\u0436\u0430\u043d\u0433\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0435\u0441\u0441\u0438\u0439, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 base64. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u044f\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.    &#8212; <a href=\"https:\/\/github.com\/jazzband\/django-user-sessions\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/jazzband\/django-user-sessions<\/a><\/p>\n<\/blockquote>\n<p>\u041d\u0443 \u0447\u043e, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c.<\/p>\n<p>\u0410 \u0435\u0449\u0451 \u0432 \u0441\u0435\u0441\u0441\u0438\u044f\u0445 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043d\u043e \u0432\u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445:<\/p>\n<pre><code class=\"python\"># Session is modified. request.session['foo'] = 'bar'  # Session is modified. del request.session['foo']  # Session is modified. request.session['foo'] = {}  # Gotcha: Session is NOT modified, because this alters # request.session['foo'] instead of request.session. request.session['foo']['bar'] = 'baz'<\/code><\/pre>\n<p>\u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0442\u0430\u043a, \u043d\u043e \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043b\u0438\u0431\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0451, \u043b\u0438\u0431\u043e \u043d\u0438\u043a\u0430\u043a, \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 gotcha. \u0421\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0430\u0440\u0435\u043d\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0438 \u044f\u0432\u043d\u043e\u0433\u043e \u00af_(\u30c4)_\/\u00af<\/p>\n<h3>Jazzband<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0443\u043b\u0435\u0442\u0435\u043b\u0438 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0443 \u0438 \u0432\u0434\u0440\u0443\u0433 \u043f\u043e \u043f\u0440\u0438\u043b\u0451\u0442\u0443 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438, \u0447\u0442\u043e \u0437\u0430\u0431\u044b\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u0447\u0435\u043c\u043e\u0434\u0430\u043d\u044b &#8212; \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u043e\u0441\u043b\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u0447\u0442\u043e\u0439. \u0412\u043e\u0442 <a href=\"https:\/\/jazzband.co\/projects\" rel=\"noopener noreferrer nofollow\">jazzband<\/a> &#8212; \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u0430\u043a\u043e\u0439 \u0447\u0435\u043c\u043e\u0434\u0430\u043d \u0441 \u0437\u0430\u0431\u044b\u0442\u044b\u043c\u0438 \u0432\u0435\u0449\u0430\u043c\u0438.<\/p>\n<p>\u0418 \u0432\u0435\u0449\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u0432\u044b \u043d\u0435 \u0432\u0437\u044f\u043b\u0438 \u0432 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u0442\u0440\u0443\u0441\u044b \u0438\u043b\u0438 \u0434\u0435\u043d\u044c\u0433\u0438:<\/p>\n<ul>\n<li>\n<p>django-constance<\/p>\n<\/li>\n<li>\n<p>django-redis<\/p>\n<\/li>\n<li>\n<p>django-auditlog<\/p>\n<\/li>\n<li>\n<p>django-robots<\/p>\n<\/li>\n<li>\n<p>django-model-utils<\/p>\n<\/li>\n<li>\n<p>django-pipeline<\/p>\n<\/li>\n<li>\n<p>sorl-thumbnail<\/p>\n<\/li>\n<li>\n<p>&#8230;<\/p>\n<\/li>\n<\/ul>\n<h2>\u0428\u0430\u0431\u043b\u043e\u043d\u044b (templates)<\/h2>\n<h3>Rocket science<\/h3>\n<p>\u042f \u0432\u0435\u0440\u044e, \u0447\u0442\u043e \u0431\u043e\u0433 \u0443\u0441\u0442\u0440\u043e\u0438\u043b \u0432\u0435\u043b\u0438\u043a\u0438\u0439 \u043f\u043e\u0442\u043e\u043f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0440\u043e\u0434\u044f\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u044b django \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u044e\u0442 Django templates, \u0438 \u0445\u043e\u0442\u0435\u043b \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c.<\/p>\n<p>\u041d\u0435 \u0432\u044b\u0448\u043b\u043e.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0448\u0451\u043b \u0441 php, \u0433\u0434\u0435 \u0431\u044b\u043b\u043e \u043d\u043e\u0440\u043c\u043e\u0439 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0411\u0414 \u043f\u0440\u044f\u043c\u043e \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0438 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0443\u043a\u0438, \u044f \u0431\u044b\u043b \u043f\u043e\u0440\u0430\u0436\u0451\u043d \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 MVT \u0432 Django &#8212; \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433! \u0418 \u0432\u0441\u0451 \u0431\u044b \u0442\u0443\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0432\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u044b&#8230; \u0415\u0441\u043b\u0438 \u0432 php \u0431\u044b\u043b\u0430 \u043e\u0434\u043d\u0430 \u043a\u0440\u0430\u0439\u043d\u043e\u0441\u0442\u044c &#8212; \u044f \u043c\u043e\u0433 \u0441\u0434\u0435\u043b\u0430\u0442\u044c <em>\u0432\u0441\u0451<\/em> \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 &#8212; \u0442\u043e \u0442\u0443\u0442 \u044f \u043c\u043e\u0433 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e: \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434 (\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432!), \u0438\u043b\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 (\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e 1 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442), \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u043b\u0438\u0442\u044c templatetag, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e >1 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 template filter \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442?<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440? \u041e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0430\u043c\u043e?<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0435\u0441\u043b\u0438 \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u0442\u043e \u0443\u0436\u0435 template tag?<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 inclusion tag, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u044f\u0432\u043d\u043e \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435? \u042f \u0432\u0435\u0434\u044c \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e \u043a\u043e\u0434. \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 \u0435\u0449\u0451 \u0448\u0430\u0431\u043b\u043e\u043d.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0447\u0435\u043c takes_context, \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u044f\u0432\u043d\u043e?<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0447\u0435\u043c \u0441\u043f\u043b\u0438\u0442\u0442\u0438\u0442\u044c \u043d\u0430 django.template.Node, \u0430 \u043f\u043e\u0442\u043e\u043c \u0434\u0436\u043e\u0439\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e? <\/p>\n<\/li>\n<li>\n<p>&#8230;\u0438 \u0442\u0430\u043a \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u0442\u044c template filters, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438 \u0435\u0441\u0442\u044c template tags, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; \u0445\u043c, \u0447\u0442\u043e-\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0442\u0430\u043a&#8230; \u041f\u0440\u0438\u0447\u0451\u043c \u0438\u0445 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e, \u0438 \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0438\u0441\u0430\u0442\u044c simpletag&#8230; \u0438\u043b\u0438 include_tag&#8230; \u0438\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c&#8230; \u041a\u043e\u0440\u043e\u0447\u0435, \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043c\u043e\u0433 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043b\u0430\u0437\u0438\u043b \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c.<\/p>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u044c: \u043d\u0443\u0436\u043d\u043e \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 (html \u0444\u0430\u0439\u043b\u0435) \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0447\u0451\u0440\u0442\u043e\u0432\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442! \u042d\u0442\u043e \u0436\u0435, \u043c\u0430\u0442\u044c \u0432\u0430\u0448\u0443, \u043d\u0435 \u0440\u043e\u043a\u0435\u0442 \u0441\u0430\u0435\u043d\u0441!<\/p>\n<p>\u0414\u0435\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u043a\u043e\u0433\u0434\u0430 \u044f \u043e\u0442\u043a\u0440\u044b\u043b \u0434\u043b\u044f \u0441\u0435\u0431\u044f <a href=\"http:\/\/jinja.palletsprojects.com\/\" rel=\"noopener noreferrer nofollow\">jinja2<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c python \u043a\u043e\u0434. \u041d\u0443\u0436\u043d\u0430<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-386595","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/386595","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=386595"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/386595\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=386595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=386595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=386595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}