DJango - 将模型中的 Json 字段与其他字段一起导出到 CSV
DJango - Export Json Field in Model to CSV along with other fields
我正在做一个 DJango 项目,我需要在管理员中添加一个操作来导出和下载模型的内容。我已经使用导入导出成功添加了导出操作,它可以很好地下载数据。
目前我只是使用
进行子类化
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
可以解决这个问题,但我不确定如何实施。有人可以举个例子吗?
我的Class需要导出成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)
提前致谢。
我解决了这个问题,以下是我为可能需要的人解决的方法。
首先导入以下内容,
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 TO Csv)
最后,注册模型admin
admin.site.register(Post, PostAdmin)
这将允许您使用 django-import-export 库的 importexport 功能,并在同一管理页面中定义您自己的操作。
希望对您有所帮助。
我正在做一个 DJango 项目,我需要在管理员中添加一个操作来导出和下载模型的内容。我已经使用导入导出成功添加了导出操作,它可以很好地下载数据。
目前我只是使用
进行子类化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
可以解决这个问题,但我不确定如何实施。有人可以举个例子吗?
我的Class需要导出成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)
提前致谢。
我解决了这个问题,以下是我为可能需要的人解决的方法。
首先导入以下内容,
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 TO Csv)
最后,注册模型admin
admin.site.register(Post, PostAdmin)
这将允许您使用 django-import-export 库的 importexport 功能,并在同一管理页面中定义您自己的操作。
希望对您有所帮助。