【问题标题】:Export user data with django in django-admin to CSV在 django-admin 中使用 django 将用户数据导出到 CSV
【发布时间】:2013-04-19 08:51:09
【问题描述】:

我需要导出到我的数据库的 csv 用户,所以我或多或少地清楚 (https://docs.djangoproject.com/en/dev/howto/outputting-csv/),但我需要选择之前导出的字段。

是否可以使用模型显示您可以选择要导出的字段?

【问题讨论】:

  • 您需要定期还是一次性完成?
  • 如果,定期。这个想法是将数据库的所有用户的数据导出到一个csv文件,但指定哪些字段必须复制。

标签: python django csv django-models django-admin


【解决方案1】:

从控制台,您可以简单地尝试

>>> from django.contrib.auth.models import User
>>> with open('myfile.csv', 'w') as csv:
...     for user in User.objects.all():
...         d = '%s, %s, %s,\n' % (user.username, user.last_name, user.first_name)
...         csv.write(d)

d 设置为您要保存的任何字段。

当然,如果您想多次执行此操作,这会很痛苦 - 创建一个 custom admin command 可能是一个更好的主意。

【讨论】:

  • 非常感谢您的回答,最后我不得不这样做,因为始终导出所有数据,然后使用 Excel 删除不想删除的列。
【解决方案2】:

您的问题的最佳解决方案是在您的用户管理员中创建一个操作。操作方法如下:转到您的 admin.py 并执行此操作

from django.contrib.auth import get_user_model
from django.http import HttpResponse
import csv, datetime

User = get_user_model()

def export_to_csv(modeladmin, request, queryset):
    opts = modeladmin.model._meta
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment;' 'filename={}.csv'.format(opts.verbose_name)
    writer = csv.writer(response)
    fields = [field for field in opts.get_fields() if not field.many_to_many and not field.one_to_many]
    # Write a first row with header information
    writer.writerow([field.verbose_name for field in fields])
    # Write data rows
    for obj in queryset:
        data_row = []
        for field in fields:
            value = getattr(obj, field.name)
            if isinstance(value, datetime.datetime):
                value = value.strftime('%d/%m/%Y')
            data_row.append(value)
        writer.writerow(data_row)

    return response

export_to_csv.short_description = 'Export to CSV'  #short description

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    '''
    Registers the action in your model admin
    '''
    actions = [export_to_csv] 

这样,您将能够选择要导出其数据的特定用户并立即导出。

【讨论】:

  • 优秀的答案!只是一个小的更正,在 response['Content-Disposition'] 上缺少一个 '=' 字符,它应该是:'filename={}.csv'
【解决方案3】:

从 Django 3.2 开始,您还必须通过添加装饰器将export_as_csv 注册为“动作”。请参阅link 获取官方文档。

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2019-05-09
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多