基于类的视图和混入,用于处理Django中的CSV。
项目描述
基于类的视图和混入,用于在Django中响应CSV。django-separated支持Django 1.3及以上版本。
安装
$ pip install django-separated
文档
django-separated提供了许多基于查询集生成CSV文件的工具。
序列化器
separated.utils.ColumnSerializer
您可以使用ColumnSerializer来生成CSV。它接受一个列定义,并返回一个可调用的对象,您可以使用它将数据序列化为CSV。
from separated.utils import ColumnSerializer serialize_books = ColumnSerializer([ ('title', 'Title'), ('pub_date', 'Publication Date'), ('isbn', 'ISBN'), ]) with open('/tmp/books.csv', 'wb') as f: books = Book.objects.all() serialize_books(books, file=f)
列定义是一个包含2元组的可迭代对象,其中第一个项目是一个访问器,用于从对象中获取值,第二个项目是列标题。
访问器可以是字符串或可调用对象。如果不是可调用对象,它将被传递给attrgetter以将其转换为可调用对象。如果访问器返回可调用对象,它将被调用。以下都是有效的访问器示例
'first_name'
'first_name.upper'
'get_absolute_url'
lambda x: x.upvotes.count() - x.downvotes.count()
您甚至可以跨关系进行操作
'author'
'author.name'
'author.book_count'
'author.user.username'
标题值是可选的,如果您希望从访问器生成标题,可以编写更简单的columns定义
serialize_books = ColumnSerializer([ 'title', # Header will be 'Title' 'pub_date', # Header will be 'Pub date' ])
您还可以混合使用这两种样式。
默认情况下,ColumnSerializer将输出标题作为第一行。如果您想抑制这种行为,请将output_headers设置为False。
视图
separated.views.CsvView
返回的 ListView 将向用户展示 CSV 文件下载。它需要一个列定义,该定义将传递给 ColumnSerializer
class UserCsvView(CsvView): model = User columns = [ ('first_name', 'First name'), ('last_name', 'Last name'), ('email', 'Email'), ]
如果需要更动态的行为,有一个对应的 get_columns 方法。
此外,您可以指定要下载的 CSV 文件的名称。如果您不提供,它将默认为模型名称 + _list.csv。例如
class UserCsvView(CsvView): model = User
将具有文件名 user_list.csv。但您可以通过设置 filename 属性来覆盖它。还有一个对应的 get_filename 方法,您可以覆盖它以实现更复杂的行为。
CsvView 将将 output_headers 的值传递给 ColumnSerializer。要关闭标题,您可以这样做
class UserCsvView(CsvView): model = False output_headers = False
separated.views.CsvResponseMixin
一个返回 CsvResponse 的 MultipleObjectMixin 子类。
这在您想要用您自己的 ListView 替换 BaseListView 时非常有用。 CsvResponseMixin 支持 CsvView 中提到的所有行为,您需要挂钩的唯一机制是一个调用 render_to_response 的 View 类,该类有一个在 object_list 键中可用的查询集。
class MyWeirdBaseListView(View): def get(self, request, *args, **kwargs): return self.render_to_response({ 'object_list': User.objects.all(), }) class MyWeirdCsvView(CsvResponseMixin, MyWeirdBaseListView): pass
separated.views.CsvResponse
一个子类 HttpResponse,将以 CSV 格式下载。 CsvResponse 需要一个作为构造函数第一个参数的 filename。
Admin
您可以在 admin 中心使用 django-separated 从 admin 网站导出 CSV。
from separated.admin import CsvExportModelAdmin class NewsAdmin(CsvExportModelAdmin): csv_export_columns = [ 'title', 'pub_date', 'author.full_name', ]
这为更改列表添加了一个操作。
csv_export_columns 对应于 CsvView.columns 属性。如果您需要更精细的控制,可以覆盖 csv_export_view_class 而不是。
from datetime import datetime from separated.admin import CsvExportModelAdmin from separated.views import CsvView class NewsCsvView(CsvView): columns = [ 'title', 'pub_date', 'author.full_name', ] output_headers = False def get_filename(self, model): return '%s-news-export.csv' % datetime.today().strftime('Y-m-d') class NewsAdmin(CsvExportModelAdmin): csv_export_view_class = NewsCsvView
csv_export_columns 和 csv_export_view_class 也作为方法存在(分别是 get_csv_export_columns 和 get_csv_export_view_class),如果需要根据请求更改它们。
from separated.admin import CsvExportModelAdmin class NewsAdmin(CsvExportModelAdmin): staff_export_columns = ( 'title', 'pub_date', 'author.full_name', ) superuser_export_columns = staff_export_columns + ( 'secret_column', ) def get_csv_export_columns(self, request): if request.user.is_superuser: return self.superuser_export_columns else: return self.staff_export_columns
获取器
django-separated 提供了一些帮助器,用于在发送到 CSV 写入器之前规范化从模型返回的数据。这些都是基于一个 Getter 类,该类处理不同类型的访问器。
separated.utils.BooleanGetter
如果您有一个布尔值,希望将其转换为 Yes 或 No,您可以使用 BooleanGetter
from separated.utils import BooleanGetter user_serializer = ColumnSerializer([ BooleanGetter('is_admin'), ])
separated.utils.DisplayGetter
如果您有一个具有选项的模型字段,并且希望 CSV 中的显示为人类可读,您可以使用 DisplayGetter
from separated.utils import BooleanGetter class User(models.Model): favorite_color = models.CharField(max_length=255, choices=( ('blue', 'Blue'), ('green', 'Green'), ('red', 'Red'), )) user_serializer = ColumnSerializer([ DisplayGetter('favorite_color'), ])
这将使用 Django 自动添加的 get_favorite_color_display 方法。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪一个,请了解更多关于 安装包 的信息。
源分布
构建的发行版
django-separated-1.1.0.tar.gz 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | d923ba0a961ec37163e3f250beb564fef9149c9059f6a7080666ef07ae13adf2 |
|
MD5 | 9e0b8ccbd8752f7b3bd1d1e4d62c7950 |
|
BLAKE2b-256 | 68a512875a61158a88c40de31e41d2c79fd6a8ff5d9dbdb39d3ac93d9de6552a |
django_separated-1.1.0-py2-none-any.whl 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 98d2d46067119c41e6694911654b12943b27c0a3688cb99552d78f0205eb492c |
|
MD5 | 1b6cbf90b9d505bb619e32a63d67659b |
|
BLAKE2b-256 | 3445e774116dca335087cc08a96c6817e972343bd698cc1224526e1b977479fc |