{"id":16421727,"url":"https://github.com/peppelinux/django-auto-serializer","last_synced_at":"2025-10-11T09:36:43.331Z","repository":{"id":43047386,"uuid":"168701223","full_name":"peppelinux/django-auto-serializer","owner":"peppelinux","description":"Django app that automates objects tree serialization recursively, without any declaration","archived":false,"fork":false,"pushed_at":"2022-03-21T22:27:47.000Z","size":45,"stargazers_count":3,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-09T14:54:21.247Z","etag":null,"topics":["django","export","import","json","serializer"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/peppelinux.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-02-01T13:26:13.000Z","updated_at":"2024-09-19T09:35:26.000Z","dependencies_parsed_at":"2022-09-10T09:21:00.606Z","dependency_job_id":null,"html_url":"https://github.com/peppelinux/django-auto-serializer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/peppelinux/django-auto-serializer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peppelinux%2Fdjango-auto-serializer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peppelinux%2Fdjango-auto-serializer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peppelinux%2Fdjango-auto-serializer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peppelinux%2Fdjango-auto-serializer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peppelinux","download_url":"https://codeload.github.com/peppelinux/django-auto-serializer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peppelinux%2Fdjango-auto-serializer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266009061,"owners_count":23863542,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["django","export","import","json","serializer"],"created_at":"2024-10-11T07:34:32.911Z","updated_at":"2025-10-11T09:36:38.284Z","avatar_url":"https://github.com/peppelinux.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Django auto-serializer\nDjango app that automates objects tree serialization recursively, without any declarations.\n\nDefine new classes for every Object serialization could sound a bit boring, I coded this app to do the things automagically.\nDjango-auto-serializer will do for you:\n\n- Json serialization (export);\n- recursively serialize all FK childrens;\n- can ignore some children if you tell him how they are named (see examples above);\n- M2M auto serialization;\n- ignore or not autofields import/export (auto_now_add...);\n- regenerates unique if needed, the same for slugfields (change_uniques = True,);\n- Import a serialized Object tree, it will build up everything as before;\n\n## Setup\n````\npip install git+https://github.com/peppelinux/django-auto-serializer.git\n````\n\n## Usage Example\n````\nfrom my_app.models import MyModel\n\n# get an object\nmyObj = MyModel.objects.first()\n\n# object serialization\n# A single object duplication\nsi = SerializableInstance(myObj)\n\n#si.serialize_obj()\nsi.serialize_tree()\nsi.remove_duplicates()\n# pprint(si.dict)\n\n# Serialized entire tree, main object with childrens\nsi = SerializableInstance(myObj,\n                          excluded_fields=['field1', 'field2'],\n                          excluded_childrens = ['relatedObjClass1', 'relatedObjClass2'],\n                          auto_fields = False,\n                          change_uniques = True,\n                          duplicate = True)\nsi.serialize_tree()\nsi.remove_duplicates()\n````\n\n## Some coding hints\n````\nimport pprint\n# all the fields\nmyObj._meta._forward_fields_map\n\n# childrens here\nmyObj._meta.fields_map\nmyObj._meta.related_objects\n\n# another way with NestedObjects\nfrom django.contrib.admin.utils import NestedObjects\nfrom django.db import DEFAULT_DB_ALIAS\n\n# get json with pk and autofilled fields as they are\nfrom django.core import serializers\nserializers.serialize('json', [myObj], ensure_ascii=False)\n\n# serializers.serialize() relies on\nmodel_to_dict(myObj)\n\npprint(sit.dict)\nfor i in sit.dict['childrens']:\n    if i['model_name'] == 'ClassName':\n        pprint(i)\n\ntree_to_str = json.dumps(si.dict, indent=2)\njsonstr_to_dict = json.loads(tree_to_str)\npprint(jsonstr_to_dict )\n````\n\n## Import dump\n````\nisi = ImportableSerializedInstance(si.dict)\nisi.save()\nprint(isi.json())\n````\n\n## A simple view to import a json dump\n````\n@user_passes_test(lambda u:u.is_staff)\ndef import_file(request):\n    file_to_import = request.FILES.get('file_to_import')\n    # content here\n    url = reverse('admin:my_django_admin_url')\n    if not file_to_import:\n        return HttpResponseRedirect(url)\n    if not file_to_import:\n        # error message here\n        pass\n    jcont = json.loads(request.FILES['file_to_import'].read().decode(settings.DEFAULT_CHARSET))\n    isi = ImportableSerializedInstance(jcont)\n    isi.save()\n    return HttpResponseRedirect(url)\n````\n\n## Django admin action to duplicate or export an entire tree\n````\nimport io\nimport json\n\nfrom django.apps import apps\nfrom django.contrib import messages\nfrom django.contrib.admin.models import LogEntry, ADDITION, CHANGE\nfrom django.contrib.contenttypes.models import ContentType\nfrom django.http.response import HttpResponse\n\nfrom django_auto_serializer.auto_serializer import (SerializableInstance,\n                                                    ImportableSerializedInstance)\n\nfrom .models import *\n\n\ndef my_clone_func(modeladmin, request, queryset):\n    for myObj in queryset:\n        try:\n            si = SerializableInstance(myObj)\n            si.serialize_tree()\n            si.remove_duplicates()\n        except Exception as e:\n            msg = '{} cloning failed: {}'\n            messages.add_message(request, messages.WARNING,\n                                 msg.format(myObj, e))\n        try:\n            isi = ImportableSerializedInstance(si.dict)\n            isi.save()\n        except Exception as e:\n            msg = '{} cloning failed: {}'\n            messages.add_message(request, messages.WARNING,\n                                 msg.format(myObj, e))\n\n        msg = '{} successfully cloned.'\n        messages.add_message(request, messages.INFO,\n                             msg.format(myObj))\nmy_clone_func.short_description = \"Clone object and its configuration\"\n\n\ndef download_obj_template(modeladmin, request, queryset):\n    iofile = io.StringIO()\n    obj_labels = []\n    for myObj in queryset:\n        try:\n            si = SerializableInstance(myObj)\n            st = si.serialize_tree()\n            iofile.write(json.dumps(si.dict, indent=2))\n        except Exception as e:\n            msg = '{} cloning failed: {}'\n            messages.add_message(request, messages.WARNING,\n                                 msg.format(myObj, e))\n        obj_labels.append(myObj.__str__())\n    file_name = 'my_export{}.json'.format('_'.join(obj_labels))\n    iofile.seek(0)\n    response = HttpResponse(iofile.read())\n    response['content_type'] = 'application/force-download'\n    response['Content-Disposition'] = 'attachment; filename={}'.format(file_name)\n    response['X-Sendfile'] = file_name\n    return response\ndownload_obj_template.short_description = \"Download object json template\"\n````\n\n## Result (from a real NavigationBar object with items and items childs)\n````\n{'source_pk': 266,\n 'duplicate': True,\n 'app_name': 'cmsmenus',\n 'model_name': 'NavigationBar',\n 'object': {'created_by': 2,\n  'created_by_id': 2,\n  'is_active': True,\n  'name': 'test'},\n 'm2m': [],\n 'childrens': [{'source_pk': 1603,\n   'duplicate': True,\n   'app_name': 'cmsmenus',\n   'model_name': 'NavigationBarItem',\n   'object': {'created_by': 2,\n    'created_by_id': 2,\n    'order': 1,\n    'is_active': True,\n    'name': 'child 1',\n    'parent': 1602,\n    'parent_id': 1602,\n    'url': 'None'},\n   'm2m': [],\n   'childrens': [{'source_pk': 1604,\n     'duplicate': True,\n     'app_name': 'cmsmenus',\n     'model_name': 'NavigationBarItem',\n     'object': {'created_by': 2,\n      'created_by_id': 2,\n      'order': 2,\n      'is_active': True,\n      'menu': 266,\n      'menu_id': 266,\n      'name': 'child 2',\n      'url': 'None'},\n     'm2m': [],\n     'childrens': [],\n     'depth': 2,\n     'save': False,\n     'related_field': 'parent'}],\n   'depth': 1,\n   'save': False,\n   'related_field': 'menu'},\n  {'source_pk': 1604,\n   'duplicate': True,\n   'app_name': 'cmsmenus',\n   'model_name': 'NavigationBarItem',\n   'object': {'created_by': 2,\n    'created_by_id': 2,\n    'order': 2,\n    'is_active': True,\n    'name': 'child 2',\n    'parent': 1603,\n    'parent_id': 1603,\n    'url': 'None'},\n   'm2m': [],\n   'childrens': [],\n   'depth': 1,\n   'save': False,\n   'related_field': 'menu'},\n  {'source_pk': 1602,\n   'duplicate': True,\n   'app_name': 'cmsmenus',\n   'model_name': 'NavigationBarItem',\n   'object': {'created_by': 2,\n    'created_by_id': 2,\n    'modified_by': 2,\n    'modified_by_id': 2,\n    'order': 10,\n    'is_active': True,\n    'name': 'parent',\n    'url': 'None'},\n   'm2m': [],\n   'childrens': [{'source_pk': 1603,\n     'duplicate': True,\n     'app_name': 'cmsmenus',\n     'model_name': 'NavigationBarItem',\n     'object': {'created_by': 2,\n      'created_by_id': 2,\n      'order': 1,\n      'is_active': True,\n      'menu': 266,\n      'menu_id': 266,\n      'name': 'child 1',\n      'url': 'None'},\n     'm2m': [],\n     'childrens': [{'source_pk': 1604,\n       'duplicate': True,\n       'app_name': 'cmsmenus',\n       'model_name': 'NavigationBarItem',\n       'object': {'created_by': 2,\n        'created_by_id': 2,\n        'order': 2,\n        'is_active': True,\n        'menu': 266,\n        'menu_id': 266,\n        'name': 'child 2',\n        'url': 'None'},\n       'm2m': [],\n       'childrens': [],\n       'depth': 3,\n       'save': True,\n       'related_field': 'parent'}],\n     'depth': 2,\n     'save': True,\n     'related_field': 'parent'},\n    {'source_pk': 35,\n     'duplicate': True,\n     'app_name': 'cmsmenus',\n     'model_name': 'NavigationBarItemLocalization',\n     'object': {'created_by': 2,\n      'created_by_id': 2,\n      'modified_by': 2,\n      'modified_by_id': 2,\n      'is_active': True,\n      'language': 'en',\n      'name': 'adasdasd'},\n     'm2m': [],\n     'childrens': [],\n     'depth': 2,\n     'save': True,\n     'related_field': 'item'}],\n   'depth': 1,\n   'save': True,\n   'related_field': 'menu'}],\n 'depth': 0,\n 'save': True}\n````\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeppelinux%2Fdjango-auto-serializer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeppelinux%2Fdjango-auto-serializer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeppelinux%2Fdjango-auto-serializer/lists"}