{"id":334860,"date":"2022-06-23T09:00:28","date_gmt":"2022-06-23T09:00:28","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=334860"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=334860","title":{"rendered":"<span>\u0412\u0441\u0435 \u0444\u0438\u0433\u043d\u044f, \u0434\u0430\u0432\u0430\u0439 \u043f\u043e-\u043d\u043e\u0432\u043e\u0439 \u0438\u043b\u0438 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 Django Rest Framework<\/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<blockquote>\n<p>\u2014 \u0422\u044b \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c django-moderation? \u0418 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0431\u044b\u043b\u0438 \u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043b\u0438\u0431\u043e \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442, \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u0445?<\/p>\n<p>\u2014 \u041d\u0435, \u043d\u0435 \u0434\u0435\u043b\u0430\u043b \u0442\u0430\u043a\u043e\u0433\u043e. \u0412\u043e\u0442 \u044f \u0432\u0441\u0435 \u0442\u0430\u043a\u0438 <s>\u043e\u0445<\/s> \u043e\u0431\u0435\u0441\u043a\u0443\u0440\u0430\u0436\u0435\u043d \u043e\u0442 \u0442\u0432\u043e\u0438\u0445 \u0437\u0430\u043d\u044f\u0442\u0438\u0439. \u0417\u0430\u0447\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u043e?<\/p>\n<p>&#8230; \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0440\u0432\u0430\u043d\u043e \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<\/blockquote>\n<p>\u0418 \u043f\u0440\u0430\u0432\u0434\u0430 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0442\u0430\u043a \u0432\u0441\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c? \u042d\u0442\u043e \u0431\u044b\u043b\u0438 \u043c\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u043c\u044b\u0441\u043b\u0438, \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u044f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u043e\u044f\u043b\u0430 \u043f\u0435\u0440\u0435\u0434 \u043c\u043e\u0438\u043c \u0443\u0436\u0435 \u043e\u043a\u0440\u0435\u043f\u0448\u0438\u043c \u0442\u0435\u043b\u043e\u043c \u0438 \u0434\u0443\u0445\u043e\u043c (\u043d\u0435\u0442). <\/p>\n<p>\u041f\u043e\u0438\u0441\u043a \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430\u0447\u0430\u043b\u0441\u044f \u0441 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/dominno\/django-moderation\" rel=\"noopener noreferrer nofollow\">django-moderation<\/a>. \u0420\u0430\u0431\u043e\u0447\u0438\u0439 \u0434\u0435\u043d\u044c \u0443\u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b \u043a \u043a\u043e\u043d\u0446\u0443, \u043a\u043e\u0433\u0434\u0430 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u043b \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 \u0438 \u0435\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0435. \u0411\u044b\u0432\u0430\u043b\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c: &#171;\u0410 \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u044b \u043d\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u043b \u0443 \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443?&#187; \u042f \u0432\u0430\u043c \u043e\u0442\u0432\u0435\u0447\u0443: &#171;\u042f \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b, \u043d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0442\u0432\u0435\u0442\u044b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u0438 \u0432\u0441\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u0435\u043d\u044f \u0432 \u0442\u0443\u043f\u0438\u043a, \u043f\u0430\u043a\u0435\u0442 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u0430 \u0432\u0440\u0435\u043c\u044f \u0435\u0449\u0435 \u0431\u044b\u043b\u043e, \u044f \u043f\u0440\u0438\u043d\u044f\u043b \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0445\u043e\u0442\u044f-\u0431\u044b \u0434\u043b\u044f \u0441\u0435\u0431\u044f (\u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u0432 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 <abbr title=\"\u041f\u0440\u043e\u0435\u043a\u0442 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\" type=\"abbr\">\u041f\u041c<\/abbr> \u0438 \u0442\u0438\u043c\u043b\u0438\u0434\u043e\u043c)&#187;.<\/p>\n<p>\u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044f\u00a0 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 django-moderation:<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432 <code>INSTALLED_APPS<\/code> \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/django-moderation.readthedocs.io\/en\/latest\/getting_started.html\" rel=\"noopener noreferrer nofollow\">\u201cmoderation<\/a>\u201d \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u201c<a href=\"https:\/\/github.com\/wemake-services\/django-test-migrations\" rel=\"noopener noreferrer nofollow\">django_test_migrations.contrib.django_checks.AutoNames<\/a>\u201d , \u0442\u043e \u0436\u0434\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 <code>ModuleNotFoundError: No module named 'django_test_migrations.contrib.django_checks.AutoNames'; 'django_test_migrations.contrib.django_checks' is not a package<\/code>. \u0414\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 <code>django-test-migrations<\/code>. \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u043d\u044f\u0442\u044c &#8212; \u0434\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0438\u0437-\u0437\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <code>ModerationConfig<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 <code>moderation<\/code> \u0438 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 <code>apps.py<\/code> \u0438 <code>helpers.py<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 <code>apps.py<\/code> \u0438 <code>helpers.py<\/code>, \u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438\u0437 <code>INSTALLED_APPS<\/code> \u043f\u0430\u043a\u0435\u0442\u0430 <code>django-test-migrations<\/code>, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438\u0441\u044c \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043f\u0430\u043a\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e:\u00a0<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438, \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0430 \u043d\u0435 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0415\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0442\u043e \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u043e \u0432 api \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043e\u0448\u0438\u0431\u043a\u0443 <code>Multiple moderations found for object\/s: &lt;QuerySet [...]><\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043e\u043d \u0434\u0435\u043b\u0430\u043b\u0441\u044f \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u043c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 (\u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u0441\u044f \u0432 api \u0438 \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435), \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u043c, \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0440\u043e\u043b\u0435\u0439 \u0432 \u043f\u0430\u043a\u0435\u0442\u0435, \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u043d\u0430 <a href=\"https:\/\/docs.djangoproject.com\/en\/4.0\/topics\/auth\/default\/#groups\" rel=\"noopener noreferrer nofollow\">\u0433\u0440\u0443\u043f\u043f\u044b<\/a>, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0430.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f Django Framework, \u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0430 Django Rest Framework. \u042f \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u0432\u0441\u0435 \u043c\u043e\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u0438 \u043a\u0430\u043a \u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u043c\u0443\u0447\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u0438 \u043f\u0430\u043a\u0435\u0442 <code>django-moderation<\/code>.<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u043e\u044f\u0441\u043d\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044f: <br \/>1) \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 &#8212; \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c;<\/p>\n<p>2) \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 &#8212; \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0411\u0414 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438, \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u044f\u0442 \u043a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 <code>User<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435 <code>role<\/code>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0435 \u0437\u0430 \u0440\u043e\u043b\u0435\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<pre><code class=\"python\">from django.contrib.auth.models import AbstractUser from django.db import models from django.utils.translation import gettext_lazy as _   class UserRole(models.TextChoices):     \"\"\"\u0420\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\"\"\"      LIDER = 'lr', _('\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438')     EMPLOYEE = 'ee', _('\u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438')  class User(AbstractUser):     \"\"\"\u041a\u043b\u0430\u0441\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\"\"      role = models.CharField(         _('\u0440\u043e\u043b\u044c'),         max_length=2,         help_text=_('\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435'),         choices=UserRole.choices,         default=UserRole.EMPLOYEE,     )<\/code><\/pre>\n<p>\u0418 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c <code>Company<\/code>, <code>CompanyViewSet<\/code> \u0438 <code>CompanySerializer()<\/code>, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u043b\u0435 <code>avatar<\/code> \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 (\u043c\u043e\u0434\u0435\u043b\u044c <code>CustomFile<\/code> \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 <code>File<\/code> \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/django-filer.readthedocs.io\/en\/latest\/\" rel=\"noopener noreferrer nofollow\">djago-filer<\/a>).<\/p>\n<pre><code class=\"python\">class Company(BaseModel):     \"\"\"\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f.\"\"\"      avatar = models.ForeignKey(         'name_app.CustomFile',         on_delete=models.CASCADE,         verbose_name=_('\u0430\u0432\u0430\u0442\u0430\u0440 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438'),         related_name='companies',         null=True,         blank=True,     )     name = models.CharField(         _('\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438'),         max_length=250,         help_text=_('\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438'),         unique=True,     )     phone = PhoneNumberField(         _('\u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430'), blank=True,     )     email = models.EmailField(         _('\u0430\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b'), blank=True,     )            class CompanyViewSet(ModelViewSet):     \"\"\"\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.\"\"\"      serializer_class = CompanySerializer     queryset = Company.objects.all()     ordering_fields = '__all__'      def perform_update(self, serializer):         \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u0441\u0434\u0435\u043b\u0430\u0432\u0448\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441.\"\"\"         serializer.save(request_user=self.request.user)      def perform_create(self, serializer):         \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u0441\u0434\u0435\u043b\u0430\u0432\u0448\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441.\"\"\"         serializer.save(request_user=self.request.user)   class CompanySerializer(ModerationModelSerializer):     \"\"\"\u0421\u0435\u0440\u0438\u0430\u043b\u0430\u0439\u0437\u0435\u0440 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.\"\"\"      class Meta(object):         model = Company         fields = ('id', 'avatar', 'name', 'phone', 'email')         moderation_fields = ('avatar', 'name', 'phone',  'email')         moderation_enabled = (UserRole.EMPLOYEE,)         moderators = (UserRole.LIDER,)         forced_update = False <\/code><\/pre>\n<p><code>CompanySerializer()<\/code> \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <code>ModerationModelSerializer<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0438\u0436\u0435. \u0422\u0430\u043a\u0436\u0435 \u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b:<\/p>\n<p>1) <code>moderation_fields<\/code> &#8212; \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f. \u0414\u043b\u044f \u043f\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u043e\u0448\u043b\u0438 \u0432 <code>moderation_fields<\/code> \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438. \u0415\u0441\u043b\u0438 <code>moderation_fields<\/code> \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u043f\u043e\u0434\u043b\u0435\u0436\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e, \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 (\u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f <code>moderation_enabled)<\/code>;<\/p>\n<p>2) <code>moderation_enabled<\/code> &#8212; \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f. \u0415\u0441\u043b\u0438 <code>moderation_enabled<\/code> \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0442\u043e <code>ModerationModelSerializer<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a <code>serializers.ModelSerializer,<\/code> \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443;<\/p>\n<p>3) <code>moderators<\/code> &#8212; \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440\u044b. \u0415\u0441\u043b\u0438 <code>moderators<\/code> \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0442\u043e \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0440\u043e\u043b\u0438, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u0445, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 <code>moderation_enabled<\/code>;<\/p>\n<p>4) <code>forced_update<\/code> &#8212; \u0444\u043b\u0430\u0433, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e <code>False<\/code>, \u0442\u043e \u043f\u043e\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 <code>moderation_fields<\/code>, \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u0438 \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043c\u0435\u044e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0432 <code>True<\/code>, \u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u0445, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 <code>moderation_fields<\/code> \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u043e\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e. \u0414\u0430\u043d\u043d\u044b\u0439 \u0444\u043b\u0430\u0433 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u041f\u043e\u043d\u0438\u043c\u0430\u044e \u0447\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f, \u043d\u043e \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438. \u0412\u0440\u043e\u0434\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u043f\u0443\u0441\u0442\u0438\u043b, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430.<\/p>\n<hr\/>\n<h3>0. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/h3>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/63d\/fc0\/985\/63dfc09853d884b1a0d49c1999949a8f.png\" alt=\"\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.\" title=\"\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.\" width=\"1185\" height=\"701\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/63d\/fc0\/985\/63dfc09853d884b1a0d49c1999949a8f.png\"\/><figcaption>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.<\/figcaption><\/figure>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0445\u043e\u0447\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438, \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u0412\u043c\u0435\u0441\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c. <\/p>\n<p>\u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u0441 \u043a\u0443\u0447\u0435\u0439 \u043f\u0440\u0430\u0432, \u0432\u0438\u0434\u0438\u0442, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0445\u043e\u0442\u0435\u043b \u0432\u043d\u0435\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u0445, \u043b\u0438\u0431\u043e \u043d\u0435\u0442. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u043d\u043e\u0441\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0440\u044f\u0434 \u0438 \u043f\u043e \u043d\u0438\u043c \u043d\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. <\/p>\n<h3>1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438.<\/h3>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u043e\u0434\u0435\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0430 \u0432\u0437\u044f\u0442\u0430 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <code>django-moderation<\/code> \u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u0435 <code>serializer_class<\/code> &#8212; \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c <code>CompanySerializer)<\/code> . \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0435 <code>changed_object<\/code> &#8212; \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 json \u0432\u0438\u0434\u0435. \u041a\u043b\u044e\u0447\u0430\u043c\u0438 \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043d\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0445\u043e\u0442\u0435\u043b\u0438 \u0432\u043d\u0435\u0441\u0442\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0435 <code>comment<\/code> &#8212; \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (\u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u044f).<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"python\">from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils.translation import gettext_lazy as _  User = get_user_model()   class StatusModeration(models.TextChoices):     \"\"\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.\"\"\"      PENDING = 'p', _('\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438')     APPROVED = 'a', _('\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u044b')     REJECTED = 'r', _('\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u044b')   class ModeratedObject(models.Model):     \"\"\"\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.\"\"\"      content_type = models.ForeignKey(         ContentType,         null=True,         blank=True,         verbose_name=_('\u0442\u0438\u043f \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430'),         on_delete=models.SET_NULL,     )     object_pk = models.PositiveIntegerField(         _('id \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430'), null=True, blank=True, db_index=True,     )     serializer_class = models.CharField(         _('\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430'), max_length=200,     )     creation_date = models.DateTimeField(     _('\u0434\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f'), auto_now_add=True,     )     update_date = models.DateTimeField( _('\u0434\u0430\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f'), auto_now=True, )     status = models.CharField(         _('\u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430'),         max_length=2,         help_text=_('\u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438'),         choices=StatusModeration.choices,         default=StatusModeration.PENDING,     )     suggested = models.ForeignKey(         User,         on_delete=models.SET_NULL,         null=True,         verbose_name=_('\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0432\u0448\u0438\u0439 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f'),         related_name='suggested_moderated_objects',     )     moderation_date = models.DateTimeField(         _('\u0434\u0430\u0442\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438'), blank=True, null=True,     )     comment = models.TextField(         _('\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443'), blank=True,     )     changed_object = models.JSONField(         _('\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435'), null=True, blank=True,     )     changed = models.ForeignKey(         User,         on_delete=models.SET_NULL,         null=True,         blank=True,         verbose_name=_('\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c - \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440'),         related_name='changed_moderated_objects',     )      class Meta(BaseModel.Meta):         verbose_name = _('\u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430')         verbose_name_plural = _('\u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432')      def __str__(self):         return f'{self.content_type}: id - {self.object_pk}'<\/code><\/pre>\n<h3>2. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 view \u0438 serializer<\/h3>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0448\u043b\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u0435, \u043a\u0440\u043e\u043c\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 <code>serializer<\/code> \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441. \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u043e\u043b\u0438 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"python\">class ModeratedObjectViewSet(NestedViewSetMixin, BaseViewSet):     \"\"\"\u041c\u043e\u0434\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.\"\"\"      serializer_class = ModeratedObjectSerializer     queryset = ModeratedObject.objects.all()     ordering_fields = '__all__'     filterset_class = ModeratedObjectFilter      def perform_update(self, serializer):         \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u0441\u0434\u0435\u043b\u0430\u0432\u0448\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441.\"\"\"         serializer.save(request_user=self.request.user)      def perform_create(self, serializer):         \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u0441\u0434\u0435\u043b\u0430\u0432\u0448\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441.\"\"\"         serializer.save(request_user=self.request.user) <\/code><\/pre>\n<p>\u0421 <code>serializer<\/code> \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u043e\u043b\u044c\u0448\u0435. <\/p>\n<pre><code class=\"python\">import datetime from typing import Any, Dict  from django.utils.module_loading import import_string from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from rest_framework.exceptions import ValidationError  from server.apps.bizone_bug_bounty.models import CustomFile, ModeratedObject from server.apps.bizone_bug_bounty.models.moderated_object import (     StatusModeration, ) from server.apps.bizone_users.models import User   def is_moderator(moder_obj_meta, user: User) -> bool:     \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.          :param moder_obj_meta: Meta \u043a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u0433\u0434\u0435 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430                            \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044e \u0438 \u0433\u0434\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f\/\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.     :param user: \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043d\u043e\u0441\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.          1) \u0415\u0441\u043b\u0438 \u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 - True.     2) \u0415\u0441\u043b\u0438 \u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 \u0442\u0435\u0445, \u0434\u043b\u044f \u043a\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430     \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f - True.     3) \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (\u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430) - True.     \"\"\"     if moderators := getattr(moder_obj_meta, 'moderators', None):         return user.role in moderators     if moderation_enabled := getattr(moder_obj_meta, 'moderation_enabled', None):         return user.role not in moderation_enabled     return True   def initial_fields(     initial_object,     modified_fields: Dict[str, Any], ) -> Dict[str, Any]:     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 (\u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u0411\u0414) \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.      \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \"\"\"     # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438.     initial_fields_data = {}     for field in modified_fields.keys():       # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438.         object_field = initial_object._meta.get_field(field)         # \u0414\u043b\u044f \u043f\u043e\u043b\u044f avatar \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0438\u0437-\u0437\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.         if field == 'avatar':             # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 pk, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f avatar \u0438 \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c              # \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435             pk = object_field.value_from_object(initial_object)             avatar = CustomFile.objects.get(pk=pk)             initial_fields_data.update(                 {                     'avatar': {                         'id': avatar.id,                         'url': avatar.url,                     },                 },             )         else:           # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 str \u0442\u0438\u043f\u0435.             initial_fields_data.update(                 {field: object_field.value_to_string(initial_object)},             )      return initial_fields_data   class ModeratedObjectSerializer(serializers.ModelSerializer):     \"\"\"\u0421\u0435\u0440\u0438\u0430\u043b\u0430\u0439\u0437\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.\"\"\"      initial_data_object = serializers.SerializerMethodField()      class Meta(object):         model = ModeratedObject         fields = (             'id',             'content_type',             'object_pk',             'creation_date',             'update_date',             'status',             'suggested',             'moderation_date',             'comment',             'changed_object',             'changed',             'initial_data_object',         )         read_only_fields = (             'id',             'content_type',             'object_pk',             'creation_date',             'update_date',             'suggested',             'moderation_date',             'changed',             'initial_data_object',         )      def get_initial_data_object(self, mod_obj):         \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435.          \u041f\u043e\u0434 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u0437 \u0411\u0414 \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438.         \"\"\"         if mod_obj.object_pk:           # \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0434\u0435\u043b\u0438.             object_model = mod_obj.content_type.model_class()             try:                 initial_object = object_model.objects.get(id=mod_obj.object_pk)             except object_model.DoesNotExist:                 raise ValidationError(                     _(                         '\u041c\u043e\u0434\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u0434\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d. ' +                         '\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.',                     ),                 )              return initial_fields(initial_object, mod_obj.changed_object)          return ''      def update(self, instance, validated_data):         \"\"\"\u0414\u043b\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.\"\"\"         user = validated_data.pop('request_user')          if instance.status == StatusModeration.APPROVED:             raise ValidationError(                 _('\u041e\u0431\u044a\u0435\u043a\u0442 \u0443\u0436\u0435 \u043f\u0440\u043e\u0448\u0435\u043b \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044e, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0438\u043c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b.'),             )          # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c         # \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.         moder_obj_serializer = import_string(instance.serializer_class)         # \u0421\u0442\u0430\u0442\u0443\u0441 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\/\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c         # \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043d\u0435\u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043d\u0435         # \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438         # \u0440\u043e\u043b\u044f\u043c\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.         if (             not is_moderator(moder_obj_serializer.Meta, user) or             user == instance.suggested or             user.role == instance.suggested.role         ):             self.check_status(validated_data.get('status'))             self.check_comment(validated_data.get('comment'))          # \u0415\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u044b, \u0442\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0430\u0438\u0438 instance \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c,          # \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c.         if validated_data.get('status') == StatusModeration.APPROVED:           # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Company.             object_model = instance.content_type.model_class()                          if instance.object_pk:                 # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f filter, \u0430 \u043d\u0435 get \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u0430\u043b\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f                 # \u043c\u0435\u0442\u043e\u0434 update() \u0434\u043b\u044f \u043e\u0431\u043d\u0432\u043e\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.                 qs_object_model = object_model.objects.filter(                     id=instance.object_pk,                 )                 qs_object_model.update(**instance.changed_object)             else:                 object_model.objects.create(**instance.changed_object)              validated_data.update(                 {                     'changed': user,                     'moderation_date': datetime.datetime.now(),                 },             )          return super().update(instance, validated_data)      def check_status(self, status) -> None:         \"\"\"\u041c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440.\"\"\"         if status:             raise ValidationError(_('\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.'))      def check_comment(self, comment) -> None:         \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\/\u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440.\"\"\"         if comment:             raise ValidationError(_('\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439.')) <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>def is_moderator()<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442 \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>moder_obj_meta <\/code>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043a\u043b\u0430\u0441\u0441  <code>serializer<\/code>, \u0433\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435  <code>CompanySerializer<\/code>), \u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>user<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c (\u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438).<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 <code>CompanySerializer <\/code>\u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 137 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e<code> <\/code><a href=\"https:\/\/docs.djangoproject.com\/en\/4.0\/ref\/utils\/#module-django.utils.module_loading\" rel=\"noopener noreferrer nofollow\">import_string<\/a>. \u0418\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u043e\u043b\u0435\u0439 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438  <code>ModeratedObject<\/code> \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u043f\u043e\u043b\u0435 <code>serializer_class<\/code>.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>def initial_fields()<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f api. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0411\u0414 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438)  \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 json \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>initial_object<\/code> &#8212; \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>Company<\/code>), <code>modified_fields<\/code> &#8212; \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044e, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <code>Company <\/code>\u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 111 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u043b\u044f <code>content_type<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <code>pk<\/code> \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.djangoproject.com\/en\/4.0\/ref\/contrib\/contenttypes\/#methods-on-contenttype-instances\" rel=\"noopener noreferrer nofollow\">model_class()<\/a>, \u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0443\u0436\u0435 \u043d\u0430 113 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>objects.get()<\/code> \u0438 \u043f\u043e\u043b\u044f <code>object_pk<\/code> \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 ModeratedObject, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 <code>pk<\/code> \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>def initial_fields()<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f  \u0432  \u043f\u043e\u043b\u0435<code> initial_data_object ModeratedObjectSerializer<\/code>.  \u041e\u0431\u0449\u0438\u0439 \u0432\u0438\u0434 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>ModeratedObject \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435.<\/code><\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/01d\/08f\/f1a\/01d08ff1a76ae0ca339c8e1e4e8dae5d.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 api.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 api.\" width=\"479\" height=\"478\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/01d\/08f\/f1a\/01d08ff1a76ae0ca339c8e1e4e8dae5d.png\"\/><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 api.<\/figcaption><\/figure>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 (<code>initial_data_object<\/code>) \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 <code>ModeratedObject<\/code>, \u0430 \u043d\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438, \u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0437\u0430\u0434\u0430\u0447\u0438, \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e. <\/p>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 <code>def update() ModeratedObjectSerializer<\/code> \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.djangoproject.com\/en\/4.0\/ref\/models\/querysets\/#update\" rel=\"noopener noreferrer nofollow\">update()<\/a> \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 <code>ModeratedObject.object_pk <\/code>\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.djangoproject.com\/en\/4.0\/ref\/models\/querysets\/#create\" rel=\"noopener noreferrer nofollow\">create()<\/a> \u043f\u0440\u0438 \u0435\u0433\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438.<\/p>\n<h2>3. \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f serializer<\/h2>\n<p>\u0417\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0442\u0430\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0433\u043e \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c \u043a\u0442\u043e, \u043a\u0443\u0434\u0430 \u0438 \u043a\u0430\u043a\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0445\u043e\u0447\u0435\u0442 \u0432\u043d\u0435\u0441\u0442\u0438.<\/p>\n<pre><code class=\"python\">import traceback from typing import Set  from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ from rest_framework import serializers, status from rest_framework.exceptions import APIException from rest_framework.utils import model_meta  from server.apps.bizone_bug_bounty.models import Company, Task   class CreateModerationObject(APIException):     \"\"\"\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.\"\"\"      status_code = status.HTTP_204_NO_CONTENT     default_detail = _('\u041e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.')     default_code = 'moderation'   class ModerationModelSerializer(serializers.ModelSerializer):     \"\"\"\u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0438\u0442\u043e\u0440 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.\"\"\"      def get_moderation_fields(self) -> Set[str]:         \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.\"\"\"         return getattr(self.Meta, 'moderation_fields', set())      def get_moderation_enabled_role(self) -> Set[str]:         \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u043e\u043b\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f.\"\"\"         return getattr(self.Meta, 'moderation_enabled', set())      def get_moderators_role(self) -> Set[str]:         \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0430\u0432\u043e \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.\"\"\"         return getattr(self.Meta, 'moderators', set())      def get_forced_update(self) -> bool:         \"\"\"\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435.\"\"\"         return getattr(self.Meta, 'forced_update', False)      def update(self, instance, validated_data):         \"\"\"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u0433\u043e \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.\"\"\"         # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u043b \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438         # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0443\u0436\u043d\u0430 \u043b\u0438 \u0434\u043b\u044f \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f.         user = validated_data.pop('request_user')         if user.role in self.get_moderation_enabled_role():             # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f moderation_data \u0445\u0440\u0430\u043d\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 validated_data,             # \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e.             moderation_data = {}             moderation_fields = self.get_moderation_fields()             # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u043b\u044e\u0447\u0438 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f             # \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438,             # \u0430 \u0432\u0441\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0438\u0435 \u043f\u043e\u043b\u044f \u0432 validated_data.             validated_fields = validated_data.copy().keys()             if moderation_fields:                 # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.                 for name_field in validated_fields:                     # \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442 \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442, \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u043e\u043b\u044f                     # \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438, \u0442\u043e \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0435\u0433\u043e                     # \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u043b\u044f avatar, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.                     if name_field in moderation_fields:                         if (                             name_field == 'avatar' and                             validated_data.get('avatar')                         ):                             avatar = validated_data.pop('avatar')                             moderation_data.update(                                 {                                     f'{name_field}': {                                         'id': avatar.id,                                         'name': avatar.name,                                     },                                 },                             )                         else:                             moderation_data.update(                                 {                                     f'{name_field}':                                         validated_data.pop(name_field, None),                                 },                             )                 # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u043e\u0435, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442                 # \u0436\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435.                 # \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0430\u0440\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f.                 moderated_obj, created = ModeratedObject.objects.get_or_create(                     content_type=ContentType.objects.get_for_model(                         instance.__class__,                     ),                     serializer_class='{module}.{class_name}'.format(                         module=self.__module__,                         class_name=self.__class__.__name__,                     ),                     object_pk=instance.pk,                     suggested=user,                     status=StatusModeration.PENDING,                 )                 # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435                 # \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e-\u0436\u0435                 # \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.                 moderated_obj.changed_object = moderation_data                 moderated_obj.save()              # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u044b \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u044f,             # \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c             # \u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 get_moderation_enabled_role(), \u0442\u043e             # \u043e\u043d\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b.             if not self.get_forced_update():                 return instance          # \u041a\u043e\u0434 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 update.         serializers.raise_errors_on_nested_writes(             'update', self, validated_data,         )         info = model_meta.get_field_info(instance)         m2m_fields = []          for attr, valid_value in validated_data.items():             if attr in info.relations and info.relations[attr].to_many:                 m2m_fields.append((attr, valid_value))             else:                 setattr(instance, attr, valid_value)          instance.save()          for attr, field_value in m2m_fields:             field = getattr(instance, attr)             field.set(field_value)          return instance      def create(self, validated_data):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u0433\u043e \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.          \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0440\u043e\u043b\u0438         \u043d\u0443\u0436\u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f, \u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432 ModeratedObject, \u0430 \u0432         instance \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f.          \u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.         \"\"\"         serializers.raise_errors_on_nested_writes(             'create', self, validated_data,         )          ModelClass = self.Meta.model          info = model_meta.get_field_info(ModelClass)         many_to_many = {}         for field_name, relation_info in info.relations.items():             if relation_info.to_many and (field_name in validated_data):                 many_to_many[field_name] = validated_data.pop(field_name)          # serializer_class \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u043e\u043b\u0435\u0439         # \u0438\u0437 Meta \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430         list_role = self.get_moderation_enabled_role()         user = validated_data.pop('request_user')         try:             if user.role in list_role and not self.get_forced_update():                 ModeratedObject.objects.create(                     content_type=ContentType.objects.get_for_model(ModelClass),                     suggested=user,                     serializer_class='{module}.{class_name}'.format(                         module=self.__module__,                         class_name=self.__class__.__name__,                     ),                     changed_object=validated_data,                 )                 instance = '\u041e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.'             else:                 instance = ModelClass._default_manager.create(**validated_data)         except TypeError:             tb = traceback.format_exc()             msg = (                 'Got a `TypeError` when calling `%s.%s.create()`. '                 'This may be because you have a writable field on the '                 'serializer class that is not a valid argument to '                 '`%s.%s.create()`. You may need to make the field '                 'read-only, or override the %s.create() method to handle '                 'this correctly.\\nOriginal exception was:\\n %s' %                 (                     ModelClass.__name__,                     ModelClass._default_manager.name,                     ModelClass.__name__,                     ModelClass._default_manager.name,                     self.__class__.__name__,                     tb,                 )             )             raise TypeError(msg)          if many_to_many:             for field_name, field_value in many_to_many.items():                 field = getattr(instance, field_name)                 field.set(field_value)          # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u044b \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.         # \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f instance \u043e\u0431\u044a\u0435\u043a\u0442         # ModelClass, \u043d\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 ModeratedObject.         if isinstance(instance, str):             raise CreateModerationObject(instance)          return instance <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 <code>ModerationModelSerializer<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e <code>ModerationModelSerializer<\/code>.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043c\u0435\u0442\u043e\u0434\u044b <code>create()<\/code> \u0438 <code>update()<\/code>, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0437\u044f\u0442 \u0438\u0437 <code>serializers.ModelSerializer<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <code>create()<\/code> \u0431\u044b\u043b\u0430 \u0434\u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043b\u043e\u0433\u0438\u043a\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0436\u0435\u043b\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442. \u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0440\u043e\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f, \u0442\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 <code>ModeratedObject<\/code>, \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e:<\/p>\n<ul>\n<li>\n<p><code>serializer_class<\/code> &#8212; \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f (\u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <code>CompanySerializer<\/code>), <\/p>\n<\/li>\n<li>\n<p><code>content_type<\/code> &#8212; <code>pk<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0438\u0437 <code>Meta<\/code> \u0441\u0432\u043e\u0439\u0441\u0442\u0432 <code>CompanySerializer<\/code> <\/p>\n<\/li>\n<li>\n<p><code>suggested<\/code> &#8212; \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0435\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 (\u043e\u0431\u044a\u0435\u043a\u0442 <code>Company<\/code>). <\/p>\n<\/li>\n<li>\n<p><code>changed_object<\/code> &#8212; \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043d\u043e\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f).<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 <code>instance<\/code> \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 &#171;<em>\u041e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438<\/em>&#171;. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u0435\u0442\u043e\u0434 <code>create()<\/code> \u0436\u0434\u0435\u0442 \u043e\u0442 \u043d\u0430\u0441 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u043c\u044b \u0435\u0433\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c, \u0442\u043e \u043f\u0435\u0440\u0435\u0434 <code>return<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e &#8212; \u0436\u0434\u0438 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 (\u0441\u0442\u0440\u043e\u043a\u0438 208-209). \u0415\u0441\u043b\u0438 \u0440\u043e\u043b\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438, \u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443.<\/p>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 <code>update() <\/code>\u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f, \u0442\u043e \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 <code>moderation_fields<\/code> \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0438 \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0438 \u0438\u0437 <code>serializer.validated_data<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0430\u0448\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f, \u0442\u043e \u043c\u044b \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u043a\u0443\u0434\u0430 \u0432\u043d\u043e\u0441\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0438 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f.<br \/>\u041f\u043e\u0441\u043b\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 <code>serializer.validated_data<\/code> \u043c\u044b \u043b\u0438\u0431\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043b\u0438\u0431\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u043c <code>ModeratedObject<\/code> (\u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u043e\u0434\u0440\u044f\u0434 \u043c\u0435\u043d\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f) \u0438 \u0432\u043d\u043e\u0441\u0438\u043c \u0442\u0443\u0434\u0430 \u043d\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u0422\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>create()<\/code>, \u0435\u0441\u043b\u0438 \u0440\u043e\u043b\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438, \u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443.<\/p>\n<p>\u0422\u0430\u043a \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0437\u0430\u0434\u0430\u0447\u0438. \u0422\u0435\u0441\u0442\u044b \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b, \u043d\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u0435, \u043e\u0431\u0435\u0449\u0430\u044e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f.<br \/>\u0412\u0441\u0435\u043c \u043a\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447)<\/p>\n<p>P.S. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u043e\u0439 \u043a\u043e\u0434\u0430 (\u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0434\u043b\u044f django \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b python), \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 shift+ctrl+r.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/post\/672952\/\"> https:\/\/habr.com\/ru\/post\/672952\/<\/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<blockquote>\n<p>\u2014 \u0422\u044b \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c django-moderation? \u0418 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0431\u044b\u043b\u0438 \u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043b\u0438\u0431\u043e \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442, \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u0445?<\/p>\n<p>\u2014 \u041d\u0435, \u043d\u0435 \u0434\u0435\u043b\u0430\u043b \u0442\u0430\u043a\u043e\u0433\u043e. \u0412\u043e\u0442 \u044f \u0432\u0441\u0435 \u0442\u0430\u043a\u0438 <s>\u043e\u0445<\/s> \u043e\u0431\u0435\u0441\u043a\u0443\u0440\u0430\u0436\u0435\u043d \u043e\u0442 \u0442\u0432\u043e\u0438\u0445 \u0437\u0430\u043d\u044f\u0442\u0438\u0439. \u0417\u0430\u0447\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u043e?<\/p>\n<p>&#8230; \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0440\u0432\u0430\u043d\u043e \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<\/blockquote>\n<p>\u0418 \u043f\u0440\u0430\u0432\u0434\u0430 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0442\u0430\u043a \u0432\u0441\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c? \u042d\u0442\u043e \u0431\u044b\u043b\u0438 \u043c\u043e\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u043c\u044b\u0441\u043b\u0438, \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u044f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u043e\u044f\u043b\u0430 \u043f\u0435\u0440\u0435\u0434 \u043c\u043e\u0438\u043c \u0443\u0436\u0435 \u043e\u043a\u0440\u0435\u043f\u0448\u0438\u043c \u0442\u0435\u043b\u043e\u043c \u0438 \u0434\u0443\u0445\u043e\u043c (\u043d\u0435\u0442). <\/p>\n<p>\u041f\u043e\u0438\u0441\u043a \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430\u0447\u0430\u043b\u0441\u044f \u0441 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/dominno\/django-moderation\" rel=\"noopener noreferrer nofollow\">django-moderation<\/a>. \u0420\u0430\u0431\u043e\u0447\u0438\u0439 \u0434\u0435\u043d\u044c \u0443\u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b \u043a \u043a\u043e\u043d\u0446\u0443, \u043a\u043e\u0433\u0434\u0430 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u043b \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 \u0438 \u0435\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0435. \u0411\u044b\u0432\u0430\u043b\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c: &#171;\u0410 \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u044b \u043d\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u043b \u0443 \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443?&#187; \u042f \u0432\u0430\u043c \u043e\u0442\u0432\u0435\u0447\u0443: &#171;\u042f \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b, \u043d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0442\u0432\u0435\u0442\u044b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u0438 \u0432\u0441\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u0435\u043d\u044f \u0432 \u0442\u0443\u043f\u0438\u043a, \u043f\u0430\u043a\u0435\u0442 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u0430 \u0432\u0440\u0435\u043c\u044f \u0435\u0449\u0435 \u0431\u044b\u043b\u043e, \u044f \u043f\u0440\u0438\u043d\u044f\u043b \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0445\u043e\u0442\u044f-\u0431\u044b \u0434\u043b\u044f \u0441\u0435\u0431\u044f (\u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u0432 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 <abbr title=\"\u041f\u0440\u043e\u0435\u043a\u0442 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\" type=\"abbr\">&#187; type=&#187;abbr&#187;>\u041f\u041c<\/abbr> \u0438 \u0442\u0438\u043c\u043b\u0438\u0434\u043e\u043c)&#187;.<\/p>\n<p>\u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044f\u00a0 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 django-moderation:<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432 <code>INSTALLED_APPS<\/code> \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/django-moderation.readthedocs.io\/en\/latest\/getting_started.html\" rel=\"noopener noreferrer nofollow\">\u201cmoderation<\/a>\u201d \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u201c<a href=\"https:\/\/github.com\/wemake-services\/django-test-migrations\" rel=\"noopener noreferrer nofollow\">django_test_migrations.contrib.django_checks.AutoNames<\/a>\u201d , \u0442\u043e \u0436\u0434\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 <code>ModuleNotFoundError: No module named 'django_test_migrations.contrib.django_checks.AutoNames'; 'django_test_migrations.contrib.django_checks' is not a package<\/code>. \u0414\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 <code>django-test-migrations<\/code>. \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u043d\u044f\u0442\u044c &#8212; \u0434\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0438\u0437-\u0437\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <code>ModerationConfig<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 <code>moderation<\/code> \u0438 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 <code>apps.py<\/code> \u0438 <code>helpers.py<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 <code>apps.py<\/code> \u0438 <code>helpers.py<\/code>, \u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438\u0437 <code>INSTALLED_APPS<\/code> \u043f\u0430\u043a\u0435\u0442\u0430 <code>django-test-migrations<\/code>, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438\u0441\u044c \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043f\u0430\u043a\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e:\u00a0<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438, \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0430 \u043d\u0435 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0415\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0442\u043e \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u043e \u0432 api \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043e\u0448\u0438\u0431\u043a\u0443 <code>Multiple moderations found for object\/s: &lt;QuerySet [...]><\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043e\u043d \u0434\u0435\u043b\u0430\u043b\u0441\u044f \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u043c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 (\u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u0441\u044f \u0432 api \u0438 \u0432 \u0430\u0434\u043c\u0438\u043d\u043a\u0435), \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u043c, \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0440\u043e\u043b\u0435\u0439 \u0432 \u043f\u0430\u043a\u0435\u0442\u0435, \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u043d\u0430 <a href=\"https:\/\/docs.djangoproject.com\/en\/4.0\/topics\/auth\/default\/#groups\" rel=\"noopener noreferrer nofollow\">\u0433\u0440\u0443\u043f\u043f\u044b<\/a>, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0430.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f Django Framework, \u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0430 Django Rest Framework. \u042f \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u0432\u0441\u0435 \u043c\u043e\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u0438 \u043a\u0430\u043a \u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u043c\u0443\u0447\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u0438 \u043f\u0430\u043a\u0435\u0442 <code>django-moderation<\/code>.<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u043e\u044f\u0441\u043d\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044f: <br \/>1) \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 &#8212; \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c;<\/p>\n<p>2) \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 &#8212; \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0411\u0414 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438, \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u044f\u0442 \u043a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 <code>User<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435 <code>role<\/code>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0435 \u0437\u0430 \u0440\u043e\u043b\u0435\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<pre><code class=\"python\">from django.contrib.auth.models import AbstractUser from django.db import models from django.utils.translation import gettext_lazy as _   class UserRole(models.TextChoices):     \"\"\"\u0420\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\"\"\"      LIDER = 'lr', _('\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438')     EMPLOYEE = 'ee', _('\u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438')  class User(AbstractUser):     \"\"\"\u041a\u043b\u0430\u0441\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\"\"      role = models.CharField(         _('\u0440\u043e\u043b\u044c'),         max_length=2,         help_text=_('\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435'),         choices=UserRole.choices,         default=UserRole.EMPLOYEE,     )<\/code><\/pre>\n<p>\u0418 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c <code>Company<\/code>, <code>CompanyViewSet<\/code> \u0438 <code>CompanySerializer()<\/code>, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u043b\u0435 <code>avatar<\/code> \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 (\u043c\u043e\u0434\u0435\u043b\u044c <code>CustomFile<\/code> \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 <code>File<\/code> \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/django-filer.readthedocs.io\/en\/latest\/\" rel=\"noopener noreferrer nofollow\">djago-filer<\/a>).<\/p>\n<pre><code class=\"python\">class Company(BaseModel):     \"\"\"\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f.\"\"\"      avatar = models.ForeignKey(         'name_app.CustomFile',         on_delete=models.CASCADE,         verbose_name=_('\u0430\u0432\u0430\u0442\u0430\u0440 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438'),         related_name='companies',         null=True,         blank=True,     )     name = models.CharField(         _('\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438'),         max_length=250,         help_text=_('\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438'),         unique=True,     )     phone = PhoneNumberField(         _('\u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430'), blank=True,     )     email = models.EmailField(         _('\u0430\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b'), blank=True,     )            class CompanyViewSet(ModelViewSet):     \"\"\"\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.\"\"\"      serializer_class = CompanySerializer     queryset = Company.objects.all()     ordering_fields = '__all__'      def perform_update(self, serializer):         \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u0441\u0434\u0435\u043b\u0430\u0432\u0448\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441.\"\"\"         serializer.save(request_user=self.request.user)      def perform_create(self, serializer):         \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u0441\u0434\u0435\u043b\u0430\u0432\u0448\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441.\"\"\"         serializer.save(request_user=self.request.user)   class CompanySerializer(ModerationModelSerializer):     \"\"\"\u0421\u0435\u0440\u0438\u0430\u043b\u0430\u0439\u0437\u0435\u0440 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.\"\"\"      class Meta(object):         model = Company         fields = ('id', 'avatar', 'name', 'phone', 'email')         moderation_fields = ('avatar', 'name', 'phone',  'email')         moderation_enabled = (UserRole.EMPLOYEE,)         moderators = (UserRole.LIDER,)         forced_update = False <\/code><\/pre>\n<p><code>CompanySerializer()<\/code> \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <code>ModerationModelSerializer<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0438\u0436\u0435. \u0422\u0430\u043a\u0436\u0435 \u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b:<\/p>\n<p>1) <code>moderation_fields<\/code> &#8212; \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f. \u0414\u043b\u044f \u043f\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u043e\u0448\u043b\u0438 \u0432 <code>moderation_fields<\/code> \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438. \u0415\u0441\u043b\u0438 <code>moderation_fields<\/code> \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u043f\u043e\u0434\u043b\u0435\u0436\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e, \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 (\u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f <code>moderation_enabled)<\/code>;<\/p>\n<p>2) <code>moderation_enabled<\/code> &#8212; \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f. \u0415\u0441\u043b\u0438 <code>moderation_enabled<\/code> \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0442\u043e <code>ModerationModelSerializer<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a <code>serializers.ModelSerializer,<\/code> \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443;<\/p>\n<p>3) <code>moderators<\/code> &#8212; \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440\u044b. \u0415\u0441\u043b\u0438 <code>moderators<\/code> \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0442\u043e \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0440\u043e\u043b\u0438, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u0445, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 <code>moderation_enabled<\/code>;<\/p>\n<p>4) <code>forced_update<\/code> &#8212; \u0444\u043b\u0430\u0433, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e <code>False<\/code>, \u0442\u043e \u043f\u043e\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 <code>moderation_fields<\/code>, \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u0438 \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043c\u0435\u044e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0432 <code>True<\/code>, \u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u0445, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 <code>moderation_fields<\/code> \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u043e\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e. \u0414\u0430\u043d\u043d\u044b\u0439 \u0444\u043b\u0430\u0433 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u041f\u043e\u043d\u0438\u043c\u0430\u044e \u0447\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f, \u043d\u043e \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438. \u0412\u0440\u043e\u0434\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u043f\u0443\u0441\u0442\u0438\u043b, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430.<\/p>\n<hr\/>\n<h3>0. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/h3>\n<figure class=\"full-width\"><figcaption>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.<\/figcaption><\/figure>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0445\u043e\u0447\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438, \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u0412\u043c\u0435\u0441\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c. <\/p>\n<p>\u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u0441 \u043a\u0443\u0447\u0435\u0439 \u043f\u0440\u0430\u0432, \u0432\u0438\u0434\u0438\u0442, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0445\u043e\u0442\u0435\u043b \u0432\u043d\u0435\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u0445, \u043b\u0438\u0431\u043e \u043d\u0435\u0442. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u043d\u043e\u0441\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0440\u044f\u0434 \u0438 \u043f\u043e \u043d\u0438\u043c \u043d\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. <\/p>\n<h3>1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438.<\/h3>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u043e\u0434\u0435\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0430 \u0432\u0437\u044f\u0442\u0430 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <code>django-moderation<\/code> \u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u0435 <code>serializer_class<\/code> &#8212; \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c <code>CompanySerializer)<\/code> . \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0435 <code>changed_object<\/code> &#8212; \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 json \u0432\u0438\u0434\u0435. \u041a\u043b\u044e\u0447\u0430\u043c\u0438 \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043d\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0445\u043e\u0442\u0435\u043b\u0438 \u0432\u043d\u0435\u0441\u0442\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0435 <code>comment<\/code> &#8212; \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (\u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u044f).<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"python\">from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils.translation import gettext_lazy as _  User = get_user_model()   class StatusModeration(models.TextChoices):     \"\"\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.\"\"\"      PENDING = 'p', _('\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438')     APPROVED = 'a', _('\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u044b')     REJECTED = 'r', _('\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u044b')   class ModeratedObject(models.Model):     \"\"\"\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043c\u043e\u0434\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.\"\"\"      content_type = models.ForeignKey(         ContentType,         null=True,         blank=True,         verbose_name=_('\u0442\u0438\u043f \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430'),         on_delete=models.SET_NULL,     )     object_pk = models.PositiveIntegerField(         _('id \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430'), null=True, blank=True, db_index=True,     )     serializer_class =<\/code><\/pre>\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-334860","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/334860","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=334860"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/334860\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=334860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=334860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=334860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}