=====
NESCS
=====
``NESTED SERIALIZER CREATE SERVICE``
Installation
------------
Установка через PyPi::
pip install nescs
Description
-----------
Данная библиотека позволяет автоматически создавать объекты во
вложенных сериализаторах.
Работу по созданию вложенных объектов берет на себя сервис -
``SerializerCreateService``.
Он поддерживает создание объектов в случаях
1. Many to many
2. One to one
3. Foreign key
Examples
--------
Ниже расположено несколько примеров использования библиотеки на
различных вариантах связи между моделями
Many to many case
~~~~~~~~~~~~~~~~~
Для создание объектов с отношением **m2m** используется метод ``create_m2m_instances``
Пример кода для случая **m2m**::
class PublicationSerializer(serializers.ModelSerializer):
class Meta:
model = Publication
fields = (
'id',
'title',
)
class ArticleSerializer(serializers.ModelSerializer):
publications = PublicationSerializer(
many=True
)
class Meta:
model = Article
fields = (
'id',
'headline',
'publications',
)
def create(self, validated_data):
service = SerializerCreateService(self, validated_data, m2m_fields=['publications'])
current_instance = super().create(validated_data)
service.create_m2m_instances(
parent_instance=current_instance
)
return current_instance
One to one case
~~~~~~~~~~~~~~~~~
Для создание объектов с отношением **o2o** используется метод ``create_child_instances``
Пример кода для случая **o2o**::
class RestaurantDirectorSerializer(serializers.ModelSerializer):
class Meta:
model = RestaurantDirector
fields = (
'id',
'name',
)
class RestaurantSerializer(serializers.ModelSerializer):
director = RestaurantDirectorSerializer(
required=True
)
class Meta:
model = Restaurant
fields = (
'id',
'serves_hot_dogs',
'serves_pizza',
'director',
)
def create(self, validated_data):
service = SerializerCreateService(
self,
validated_data,
child_fields=['director']
)
restaurant = super().create(validated_data)
service.create_child_instances(restaurant)
return restaurant
Foreign key case
~~~~~~~~~~~~~~~~~
Для создание объектов с отношением **fk** используется метод ``create_fk_instances``
Пример кода для случая **fk**::
class ReporterSerializer(serializers.ModelSerializer):
class Meta:
model = Reporter
fields = (
'id',
'first_name',
'last_name',
)
class NewsSerializer(serializers.ModelSerializer):
reporter = ReporterSerializer(
required=True
)
class Meta:
model = News
fields = (
'id',
'headline',
'reporter'
)
def create(self, validated_data):
service = SerializerCreateService(self, validated_data, fk_fields=['reporter'])
service.create_fk_instances()
return super().create(validated_data)
Feature
-------
Полезные фичи
- При **инициализации** сервиса, он автоматически удаляет из ``validated_data`` поля указанные в ``m2m_fields`` и ``child_fields`` Поэтому вам ненужно вручную очищать ``validated_data`` от вложенных объектов для создания родительского объекта. Просто вызовите создание родительского объекта после инициализации сервиса. (Полезно для **o2o** и **m2m**)
- После вызова одного из методов создания вложенных объектов, в ``validated_data`` будут помещены экземпляры созданных объектов
Raw data
{
"_id": null,
"home_page": "https://github.com/twoics/nesc",
"name": "nescs",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "",
"keywords": "",
"author": "cifra-k",
"author_email": "",
"download_url": "https://files.pythonhosted.org/packages/22/61/b770243f5cabe50b6d12ea069973c53f2f321fa5d32e0140cf41692f8a1d/nescs-0.3.5.tar.gz",
"platform": null,
"description": "=====\nNESCS\n=====\n ``NESTED SERIALIZER CREATE SERVICE``\n\nInstallation\n------------\n\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 PyPi::\n\n pip install nescs\n\nDescription\n-----------\n\u0414\u0430\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432\u043e\n\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u0445.\n\u0420\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0441\u0435\u0440\u0432\u0438\u0441 -\n``SerializerCreateService``.\n\u041e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445\n\n1. Many to many\n2. One to one\n3. Foreign key\n\n\nExamples\n--------\n\u041d\u0438\u0436\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430\n\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438\n\nMany to many case\n~~~~~~~~~~~~~~~~~\n\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c **m2m** \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 ``create_m2m_instances``\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f **m2m**::\n\n class PublicationSerializer(serializers.ModelSerializer):\n class Meta:\n model = Publication\n fields = (\n 'id',\n 'title',\n )\n\n\n class ArticleSerializer(serializers.ModelSerializer):\n publications = PublicationSerializer(\n many=True\n )\n\n class Meta:\n model = Article\n fields = (\n 'id',\n 'headline',\n 'publications',\n )\n\n def create(self, validated_data):\n service = SerializerCreateService(self, validated_data, m2m_fields=['publications'])\n current_instance = super().create(validated_data)\n\n service.create_m2m_instances(\n parent_instance=current_instance\n )\n return current_instance\n\nOne to one case\n~~~~~~~~~~~~~~~~~\n\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c **o2o** \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 ``create_child_instances``\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f **o2o**::\n\n class RestaurantDirectorSerializer(serializers.ModelSerializer):\n class Meta:\n model = RestaurantDirector\n fields = (\n 'id',\n 'name',\n )\n\n class RestaurantSerializer(serializers.ModelSerializer):\n director = RestaurantDirectorSerializer(\n required=True\n )\n\n class Meta:\n model = Restaurant\n fields = (\n 'id',\n 'serves_hot_dogs',\n 'serves_pizza',\n 'director',\n )\n\n def create(self, validated_data):\n service = SerializerCreateService(\n self,\n validated_data,\n child_fields=['director']\n )\n restaurant = super().create(validated_data)\n\n service.create_child_instances(restaurant)\n return restaurant\n\nForeign key case\n~~~~~~~~~~~~~~~~~\n\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c **fk** \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 ``create_fk_instances``\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f **fk**::\n\n class ReporterSerializer(serializers.ModelSerializer):\n class Meta:\n model = Reporter\n fields = (\n 'id',\n 'first_name',\n 'last_name',\n )\n\n class NewsSerializer(serializers.ModelSerializer):\n reporter = ReporterSerializer(\n required=True\n )\n\n class Meta:\n model = News\n fields = (\n 'id',\n 'headline',\n 'reporter'\n )\n\n def create(self, validated_data):\n service = SerializerCreateService(self, validated_data, fk_fields=['reporter'])\n service.create_fk_instances()\n return super().create(validated_data)\n\n\nFeature\n-------\n \u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0444\u0438\u0447\u0438\n\n- \u041f\u0440\u0438 **\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438** \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043e\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0438\u0437 ``validated_data`` \u043f\u043e\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 ``m2m_fields`` \u0438 ``child_fields`` \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u043c \u043d\u0435\u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043e\u0447\u0438\u0449\u0430\u0442\u044c ``validated_data`` \u043e\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430. (\u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f **o2o** \u0438 **m2m**)\n\n- \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432 ``validated_data`` \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u044b \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432",
"version": "0.3.5",
"project_urls": {
"Homepage": "https://github.com/twoics/nesc"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "953b4c84f27e730b872a8757682ddcd49512e98cb71745fb0aececa4b7538ac3",
"md5": "97ae294e3070f6823431be49a15c348f",
"sha256": "f9182bb3aba3290c6ed66c26fe4455ab0a3554472d72f3f1de8c37f87f82d948"
},
"downloads": -1,
"filename": "nescs-0.3.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "97ae294e3070f6823431be49a15c348f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 4054,
"upload_time": "2023-07-09T07:48:40",
"upload_time_iso_8601": "2023-07-09T07:48:40.599098Z",
"url": "https://files.pythonhosted.org/packages/95/3b/4c84f27e730b872a8757682ddcd49512e98cb71745fb0aececa4b7538ac3/nescs-0.3.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2261b770243f5cabe50b6d12ea069973c53f2f321fa5d32e0140cf41692f8a1d",
"md5": "93280e479b16073ce9d0319d0c384bb1",
"sha256": "bf1637eb50925b0d2bb69686cfc081cd29181281e7f1cff30c74deae7db27ccb"
},
"downloads": -1,
"filename": "nescs-0.3.5.tar.gz",
"has_sig": false,
"md5_digest": "93280e479b16073ce9d0319d0c384bb1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 3960,
"upload_time": "2023-07-09T07:48:42",
"upload_time_iso_8601": "2023-07-09T07:48:42.037082Z",
"url": "https://files.pythonhosted.org/packages/22/61/b770243f5cabe50b6d12ea069973c53f2f321fa5d32e0140cf41692f8a1d/nescs-0.3.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-07-09 07:48:42",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "twoics",
"github_project": "nesc",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "Django",
"specs": [
[
"==",
"4.2.3"
]
]
},
{
"name": "djangorestframework",
"specs": [
[
"==",
"3.14.0"
]
]
},
{
"name": "setuptools",
"specs": [
[
"==",
"65.5.1"
]
]
},
{
"name": "twine",
"specs": [
[
"==",
"4.0.2"
]
]
}
],
"lcname": "nescs"
}