基于类的视图和混入,用于处理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 |