跳转到主要内容

基于类的视图和混入,用于处理Django中的CSV。

项目描述

Building Status

基于类的视图和混入,用于在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_columnscsv_export_view_class 也作为方法存在(分别是 get_csv_export_columnsget_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

如果您有一个布尔值,希望将其转换为 YesNo,您可以使用 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 (11.6 kB 查看哈希)

上传于 源代码

构建的发行版

django_separated-1.1.0-py2-none-any.whl (12.7 kB 查看散列值)

上传于 Python 2

由以下支持