DJango-将模型中的Json字段以及其他字段导出到CSV

时间:2019-01-15 14:12:54

标签: django django-import-export

我正在处理一个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)

谢谢。

1 个答案:

答案 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功能,以及在同一管理页面中定义自己的操作。

希望有帮助。