使用django处理csv的基于类的视图和mixins。

django-separated的Python项目详细描述


Building Status

基于类的视图和用于在Django中响应CSV的MIXIN。Django分离 支持django 1.3+。

安装

$ pip install django-separated

文档

django 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元组的iterable,其中第一个项是 访问器从对象中获取值,第二项是列 头球。

访问器可以是字符串或可调用的。如果它不是一个可调用的,它 将传递到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

视图

分离视图.csvview

返回的列表视图将向用户显示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
CsvResponseMixin:

一个多个对象混合子类,返回一个^ {TT21} $。

如果要将baselistview替换为 你自己的列表视图。CsvResponseMixin支持所有行为 在CsvView中提到,连接它的唯一机器是 使用具有 queryset在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

分离视图.csvresponse

将作为csv下载的httpresponse的子类。CsvResponse 需要一个filename作为构造函数的第一个参数。

管理

您可以使用管理中心中分隔的django从管理导出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

^ {TT28 } $和^ {TT30}$也作为方法存在 (分别为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类。

分离的.utils.booleangetter

如果您希望将布尔值转换为Yes,或者 No,您可以使用BooleanGetter

from separated.utils import BooleanGetter

user_serializer = ColumnSerializer([
    BooleanGetter('is_admin'),
])

分离的.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方法 自动添加。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java算法:如何对实体进行分组   C语言中的Java X509EncodedKeySpec#   如何修复java lambda筛选器(缺少返回语句)与future   java有没有办法在Swing中以亚像素精度绘制线条?   HV000030:找不到约束“javax”的验证器。验证。限制。大小为“验证类型”的java。util。可选<java。lang.String>'   CQL中语句的java分页状态   在开发时使用applet查看器的java对象相关applet   java如何从Oracle获取时区ID而不是时区偏移量   java递增变量   java JavaFX InvalizationListener或ChangeListener   java使用多个数据包将大量XMP数据插入jpg?   java允许删除请求   java为什么与类同名的方法不需要返回类型?   java数据转换错误转换   java一旦布尔值为真,如何关闭JFrame?   如何将数据写入两个java。木卫一。一次输出流对象?   mysql如何使用java在SQL中划分两列?   java使用Saxon/XQuery设置URI或目录解析器   mysql java。sql。SQLException:无法将值“20200816 17:33:21.690”从第18列转换为时间戳