我正在处理一个DJango项目,在管理员中,我需要添加一个动作,该动作将导出并下载模型的内容。我已经成功使用import-export添加了导出操作,并且它可以很好地下载数据。
目前,我只是使用
进行子类化ImportExportActionModelAdmin
,它会自动在下拉菜单中显示导出选项。
但是现在的问题是,正在下载的模型中的一个字段是JSON字段,并且正确地将其作为JSON本身导出到csv。我想知道如何将JSON字段也转换为csv的想法。
通过CSV下载的示例数据:
{u'course_name':u'ABC',u'notes':u'Test',u'contact_mode':u'Message',u'contact_no':u'9876543210',u'stud_count':u '600',u'date':u'2018-12-19T18:30:00.000Z',u'email':u'kj@test.com',u'exp11':u'YES'}
我读了一些书,看来
import_export.widgets.JSONWidget
可以解决问题,但不确定如何实现。有人可以举个例子吗?
需要导出到CSV的我的班级:
class Register(TimeStampedModel):
email = models.EmailField(max_length=100)
name = models.CharField(max_length=255)
details = JSONField(null=True, blank=True, default={})
def __str__(self):
return '%s (%s)' % (self.name, self.email)
谢谢。
答案 0 :(得分:0)
我解决了这个问题,这就是我为可能需要它的人做的事情。
首先导入以下内容,
from django.db import models
from django.http import HttpResponse
from django.contrib import admin
from import_export.admin import ImportExportMixin
import json
import csv
然后使用ImportExportMixin和ModelAdmin子类化模型管理员,然后添加所需的操作,如下所示。
class PostAdmin(ImportExportMixin, admin.ModelAdmin):
actions = [export_json_field,]
现在,定义当用户在模型的管理页面上选择此操作时要调用的函数
def export_json_field(modeladmin, request, queryset):
'''
Exports the JSON fields in a model to csv file
'''
#Create the httpResponse object with correct csv header
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="Json2Csv.csv"'
writer = csv.writer(response)
count = 0
# print(json.dumps(queryset[0].details))
for obj in queryset:
#loop through all the fields in the current post object
for field in obj._meta.fields:
#find the fields with JSONField type
if obj._meta.get_field(field.name).get_internal_type() == 'JSONField':
#get the contents of the json field and convert it into json format
detail = json.dumps(getattr(obj,field.name))
#detail = "'" + detail + "'"
detail_parsed = json.loads(str(detail))
#lists to store the keys and values from the json
keys = []
values = []
#loop through each json row and make a list of the keys and values
for key, value in detail_parsed.items():
keys.append(key)
values.append(value)
# write the values into csv file
# keys form the column headers so write them only once
if count == 0:
writer.writerow(keys)
count += 1
# write the values in each row
writer.writerow(values)
return response
export_json_field.short_description = 'Export Json TO Csv'
最后一行为此操作命名,该名称显示在管理页面的下拉框中(将Json导出到Csv)
最后,注册模型管理员
admin.site.register(Post, PostAdmin)
这将使您可以使用django-import-export库的importexport功能,以及在同一管理页面中定义自己的操作。
希望有帮助。