Django的模型数据导出
项目描述
作者:Mathieu Agopian 及 贡献者
许可证:BSD
兼容性:Python 2.6, Python 2.7, Python 3.3, Python 3.4, Django 1.3+(需要基于类的视图)
需求:django-inspect-model
Django-data-exports 是一个用于Django的模型数据导出应用。它允许您轻松地为您的模型创建导出。
将此应用添加到项目中后,您将能够为您的模型创建导出,并通过指定要包含哪些列以及使用哪种格式来自定义将要导出的数据。
典型用途:将您模型中的一小部分列显示为HTML表格,以便轻松复制/粘贴到电子表格中。
安装
pip install django-data-exports
然后将其添加到项目中的 INSTALLED_APPS。在 settings.py
INSTALLED_APPS = ( '...', # whatever you already have '...', 'data_exports', )
安装模型
./manage.py syncdb # or ./manage.py migrate if you're using south
最后,将URL连接到您的 ROOT_URLCONF
urlpatterns = patterns( '', # ... all the other urls you already have # exports url(r'^exports/', include('data_exports.urls', namespace='data_exports')), )
使用方法
可以通过管理界面添加导出,或者使用包含的示例视图。如果没有附加导出格式,则将使用以下上下文渲染 data_exports/export_detail.html 模板
export:导出本身
data:所有 export.model 实例的查询集
使用管理界面
这里没有特定的操作:连接到管理员,并添加新的导出。需要注意以下几点
当您创建导出时,最初无法添加列。原因是需要模型来填充列名
当您添加导出时,点击“保存”按钮的效果与点击“保存并继续编辑”相同
一旦创建了导出并正在编辑,可以添加列(并且以内联方式显示)
使用包含的示例视图
包含三个示例视图
/exports/add:创建一个新的导出
/exports/<export slug>/columns:向您的导出添加列
/exports/<export slug>:可视化您的导出
目前还没有导出格式的示例视图。
导出列
列选择利用 django-inspect-model 构建可访问的“项目”列表。请查阅此应用的文档了解有关“项目”的更多信息。
选择由 data_exports.forms.get_choices 构建,并将包括导出模型及其所有相关模型上的所有可访问项目。唯一可访问的相关字段是直接相关模型上的字段,这些字段使用正向或反向 OneToOne 字段和正向 ForeignKey 字段。
示例:
class Foo(models.Model): name = CharField(max_length=50) bar = ForeignKey(Bar) class Bar(models.Model): name = CharField(max_length=50)
导出 Foo 将有以下列选择
name:Foo.name
bar:Foo.bar,即 unicode(Foo.bar)
bar.name:Bar.name
要显示这些列的值,包含的模板使用 data_exports.templatetags.getter_tags
Getattribute 过滤器
{% load getter_tags %} {{ obj|getattribute:column }}
这大致等同于 Python 内置的 getattr,但可以处理列选择
如果 column 没有点,则返回 getattr(obj, column),如果它是一个可调用的对象,则返回 getattr(obj, column)()
如果 column 有点(例如:bar.name),则递归调用 getattribute() 以获取最终属性
attr = getattribute(obj, 'bar.name') # equivalent to: temp = getattr(obj, 'bar') attr = getattr(temp, 'name')
Nice_display 过滤器
{% load getter_tags %} {{ obj|getattribute:column|nice_display }}
目前,这仅仅返回一个以逗号分隔的与多对多字段相关实例的列表。
如果 item 字段有一个 all 方法
return ', '.join(map(unicode, item.all()))
高级用法
导出格式
导出可以将数据导出到指定的格式
class Format(models.Model): name = models.CharField(max_length=50) file_ext = models.CharField( max_length=10, blank=True) mime = models.CharField(max_length=50) template = models.CharField(max_length=255)
mime 字段是响应所需的 Content-Type。 file_ext 将用于计算导出文件的文件名,通过 Content-Disposition 标头提供。
示例:让我们以一个简单的 CSV 格式导出为例
mime: text/csv
file_ext: csv
name: Naive CSV 格式
template: data_exports/export_detail_csv.html(作为示例包含)
如果导出使用此格式,则访问导出的视图页面 /exports/<export slug> 将提供文件下载,文件名为 <export slug>.csv。
过滤导出
要限制条目访问,您可以使用类方法或静态方法 export_queryset,该方法将获取请求对象并返回要显示的项目查询集。
from django.contrib.auth.models import User from django.db import models class Client(models.Model): name = models.CharField(max_length=63) users = models.ManyToManyField(User) class ClientData(models.Model): client = models.ForeignKey('Client') address = models.CharField(max_length=255) money_hidden_in_the_garden = models.IntegerField() @classmethod def export_queryset(cls, request): qs = cls.objects.all() if not request.user.is_superuser: qs = qs.filter(client__in=request.user.client_set.all()) return qs
使用您自己的视图
要使用自己的视图,您需要使用与 data_exports/urls.py 中相同的 URL 名称,并确保它们使用 data_exports 命名空间,因为 django.core.urlresolvers.reverse 在内部用于计算所需的 URL。
您可以在 data_exports/views.py 中检查包含的示例视图,并且当然可以重用 data_exports/forms.py 中提供的表单。
装饰包含的视图
假设您需要使用 staff_member_required 装饰器装饰导出视图
url(r'^export/(?P<slug>[^/]+)/?$', staff_member_required(export_view), name='export_view'),
您仍然需要使用命名空间包含此新 URL,否则在视图中对 reverse 的调用将不起作用。下面是这样做的方法(摘自 Django 文档)
from django.conf.urls import include, patterns, url data_exports_patterns = patterns('', url(r'^export/(?P<slug>[^/]+)/?$', staff_member_required(export_view), name='export_view'), ) url(r'^exports', include(data_exports_patterns, namespace='data_exports')),
使用自己的模板
Django-data-exports 利用 Django 的模板覆盖机制。这意味着如果您提供了一个具有优先级的 data_exports/export_detail.html 模板,它将覆盖应用程序捆绑的模板,它将被使用。
示例:假设您在项目中有一个 templates/ 文件夹,并且有相应的 TEMPLATE_DIRS 设置。将您的模板放置在 project/templates/data_exports/export_detail.html 以代替在 data_exports/templates/data_exports/export_detail.html 中捆绑的应用程序模板。
包含三个模板
data_exports/base.html:由其他两个模板扩展
data_exports/export_detail.html:默认用于未指定格式的导出
data_exports/export_detail_csv.html:用于在 导出格式 中详细说明的“原始 csv 格式”。
修改
设置您的环境
git clone https://github.com/magopian/django-data-exports.git cd django-data-export
使用 Tox 修改并运行测试,以在所有支持的 Python 和 Django 版本上进行测试
make test
构建文档
make docs
项目详细信息
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。