Django应用程序,可递归自动序列化对象树
项目描述
Django自动序列化器
Django应用程序,可递归自动序列化对象树,无需任何声明。
为每个对象序列化定义新类可能会有些无聊,我编写了这个应用程序来自动完成这些工作。Django-auto-serializer将为您完成
- JSON序列化(导出);
- 递归序列化所有FK子项;
- 如果您告诉他它们的名称,可以忽略某些子项(请参阅上面的示例);
- M2M自动序列化;
- 忽略或自动字段导入/导出(auto_now_add...);
- 如需则重新生成唯一标识符,同样适用于slugfields(change_uniques = True,);
- 导入序列化的对象树,它将像之前一样构建一切;
设置
pip install git+https://github.com/peppelinux/django-auto-serializer.git
使用示例
from my_app.models import MyModel
# get an object
myObj = MyModel.objects.first()
# object serialization
# A single object duplication
si = SerializableInstance(myObj)
#si.serialize_obj()
si.serialize_tree()
si.remove_duplicates()
# pprint(si.dict)
# Serialized entire tree, main object with childrens
si = SerializableInstance(myObj,
excluded_fields=['field1', 'field2'],
excluded_childrens = ['relatedObjClass1', 'relatedObjClass2'],
auto_fields = False,
change_uniques = True,
duplicate = True)
si.serialize_tree()
si.remove_duplicates()
一些编码提示
import pprint
# all the fields
myObj._meta._forward_fields_map
# childrens here
myObj._meta.fields_map
myObj._meta.related_objects
# another way with NestedObjects
from django.contrib.admin.utils import NestedObjects
from django.db import DEFAULT_DB_ALIAS
# get json with pk and autofilled fields as they are
from django.core import serializers
serializers.serialize('json', [myObj], ensure_ascii=False)
# serializers.serialize() relies on
model_to_dict(myObj)
pprint(sit.dict)
for i in sit.dict['childrens']:
if i['model_name'] == 'ClassName':
pprint(i)
tree_to_str = json.dumps(si.dict, indent=2)
jsonstr_to_dict = json.loads(tree_to_str)
pprint(jsonstr_to_dict )
导入dump
isi = ImportableSerializedInstance(si.dict)
isi.save()
print(isi.json())
一个简单的视图来导入json dump
@user_passes_test(lambda u:u.is_staff)
def import_file(request):
file_to_import = request.FILES.get('file_to_import')
# content here
url = reverse('admin:my_django_admin_url')
if not file_to_import:
return HttpResponseRedirect(url)
if not file_to_import:
# error message here
pass
jcont = json.loads(request.FILES['file_to_import'].read().decode(settings.DEFAULT_CHARSET))
isi = ImportableSerializedInstance(jcont)
isi.save()
return HttpResponseRedirect(url)
Django管理操作以复制或导出整个树
import io
import json
from django.apps import apps
from django.contrib import messages
from django.contrib.admin.models import LogEntry, ADDITION, CHANGE
from django.contrib.contenttypes.models import ContentType
from django.http.response import HttpResponse
from django_auto_serializer.auto_serializer import (SerializableInstance,
ImportableSerializedInstance)
from .models import *
def my_clone_func(modeladmin, request, queryset):
for myObj in queryset:
try:
si = SerializableInstance(myObj)
si.serialize_tree()
si.remove_duplicates()
except Exception as e:
msg = '{} cloning failed: {}'
messages.add_message(request, messages.WARNING,
msg.format(myObj, e))
try:
isi = ImportableSerializedInstance(si.dict)
isi.save()
except Exception as e:
msg = '{} cloning failed: {}'
messages.add_message(request, messages.WARNING,
msg.format(myObj, e))
msg = '{} successfully cloned.'
messages.add_message(request, messages.INFO,
msg.format(myObj))
my_clone_func.short_description = "Clone object and its configuration"
def download_obj_template(modeladmin, request, queryset):
iofile = io.StringIO()
obj_labels = []
for myObj in queryset:
try:
si = SerializableInstance(myObj)
st = si.serialize_tree()
iofile.write(json.dumps(si.dict, indent=2))
except Exception as e:
msg = '{} cloning failed: {}'
messages.add_message(request, messages.WARNING,
msg.format(myObj, e))
obj_labels.append(myObj.__str__())
file_name = 'my_export{}.json'.format('_'.join(obj_labels))
iofile.seek(0)
response = HttpResponse(iofile.read())
response['content_type'] = 'application/force-download'
response['Content-Disposition'] = 'attachment; filename={}'.format(file_name)
response['X-Sendfile'] = file_name
return response
download_obj_template.short_description = "Download object json template"
结果(来自具有项目和项目子项的NavigationBar对象)
{'source_pk': 266,
'duplicate': True,
'app_name': 'cmsmenus',
'model_name': 'NavigationBar',
'object': {'created_by': 2,
'created_by_id': 2,
'is_active': True,
'name': 'test'},
'm2m': [],
'childrens': [{'source_pk': 1603,
'duplicate': True,
'app_name': 'cmsmenus',
'model_name': 'NavigationBarItem',
'object': {'created_by': 2,
'created_by_id': 2,
'order': 1,
'is_active': True,
'name': 'child 1',
'parent': 1602,
'parent_id': 1602,
'url': 'None'},
'm2m': [],
'childrens': [{'source_pk': 1604,
'duplicate': True,
'app_name': 'cmsmenus',
'model_name': 'NavigationBarItem',
'object': {'created_by': 2,
'created_by_id': 2,
'order': 2,
'is_active': True,
'menu': 266,
'menu_id': 266,
'name': 'child 2',
'url': 'None'},
'm2m': [],
'childrens': [],
'depth': 2,
'save': False,
'related_field': 'parent'}],
'depth': 1,
'save': False,
'related_field': 'menu'},
{'source_pk': 1604,
'duplicate': True,
'app_name': 'cmsmenus',
'model_name': 'NavigationBarItem',
'object': {'created_by': 2,
'created_by_id': 2,
'order': 2,
'is_active': True,
'name': 'child 2',
'parent': 1603,
'parent_id': 1603,
'url': 'None'},
'm2m': [],
'childrens': [],
'depth': 1,
'save': False,
'related_field': 'menu'},
{'source_pk': 1602,
'duplicate': True,
'app_name': 'cmsmenus',
'model_name': 'NavigationBarItem',
'object': {'created_by': 2,
'created_by_id': 2,
'modified_by': 2,
'modified_by_id': 2,
'order': 10,
'is_active': True,
'name': 'parent',
'url': 'None'},
'm2m': [],
'childrens': [{'source_pk': 1603,
'duplicate': True,
'app_name': 'cmsmenus',
'model_name': 'NavigationBarItem',
'object': {'created_by': 2,
'created_by_id': 2,
'order': 1,
'is_active': True,
'menu': 266,
'menu_id': 266,
'name': 'child 1',
'url': 'None'},
'm2m': [],
'childrens': [{'source_pk': 1604,
'duplicate': True,
'app_name': 'cmsmenus',
'model_name': 'NavigationBarItem',
'object': {'created_by': 2,
'created_by_id': 2,
'order': 2,
'is_active': True,
'menu': 266,
'menu_id': 266,
'name': 'child 2',
'url': 'None'},
'm2m': [],
'childrens': [],
'depth': 3,
'save': True,
'related_field': 'parent'}],
'depth': 2,
'save': True,
'related_field': 'parent'},
{'source_pk': 35,
'duplicate': True,
'app_name': 'cmsmenus',
'model_name': 'NavigationBarItemLocalization',
'object': {'created_by': 2,
'created_by_id': 2,
'modified_by': 2,
'modified_by_id': 2,
'is_active': True,
'language': 'en',
'name': 'adasdasd'},
'm2m': [],
'childrens': [],
'depth': 2,
'save': True,
'related_field': 'item'}],
'depth': 1,
'save': True,
'related_field': 'menu'}],
'depth': 0,
'save': True}
项目详情
下载文件
下载您平台对应的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。
源代码分发
django-auto-serializer-0.4.2.tar.gz (12.9 kB 查看哈希值)
关闭
django-auto-serializer-0.4.2.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4bf2a8f89c6bb42a9331af33f6140e4eed836116c94e28fd511566a126c6670a |
|
MD5 | 009ce0e99ea1f2c490abda5afa0066cb |
|
BLAKE2b-256 | a06fd011b5be5b735602a697183d68e5f66e0b9bd17f24bc7191962352e163ad |