Database 将所有模型导出到csv文件中
我想以CSV格式导出我的数据库。 到目前为止,“我的”代码只适用于一个表 以下是我的模型:Database 将所有模型导出到csv文件中,database,django,csv,export,prefetch,Database,Django,Csv,Export,Prefetch,我想以CSV格式导出我的数据库。 到目前为止,“我的”代码只适用于一个表 以下是我的模型: class ActsIdsModel(models.Model): year = models.IntegerField(max_length=4, blank=False, null=False) ...lots of other fields... class NationRespModel(models.Model): nationResp=models.CharField
class ActsIdsModel(models.Model):
year = models.IntegerField(max_length=4, blank=False, null=False)
...lots of other fields...
class NationRespModel(models.Model):
nationResp=models.CharField(max_length=2, unique=True)
class EUGroupRespModel(models.Model):
euGroupResp=models.CharField(max_length=50, unique=True)
class RespProposModel(models.Model):
respPropos=models.CharField(max_length=50, unique=True)
nationResp = models.ForeignKey('NationRespModel', blank=True, null=True, default=None)
euGroupResp = models.ForeignKey('EUGroupRespModel', blank=True, null=True, default=None)
class GvtCompoModel(models.Model):
gvtCompo= models.CharField(max_length=1000, blank=False, null=False)
class ActsInfoModel(models.Model):
#id of the act
actId = models.OneToOneField(ActsIdsModel, primary_key=True)
respProposId1=models.ForeignKey('RespProposModel', related_name='respProposId1', blank=True, null=True, default=None)
respProposId2=models.ForeignKey('RespProposModel', related_name='respProposId2', blank=True, null=True, default=None)
respProposId3=models.ForeignKey('RespProposModel', related_name='respProposId3', blank=True, null=True, default=None)
gvtCompo= models.ManyToManyField(GvtCompoModel)
...lots of other fields...
我使用以下代码从一个模型导出所有数据:
import csv
from django.db.models.loading import get_model
def dump(qs, outfile_path):
model = qs.model
writer = csv.writer(open(outfile_path, 'w'))
headers = []
for field in model._meta.fields:
headers.append(field.name)
writer.writerow(headers)
for obj in qs:
row = []
for field in headers:
val = getattr(obj, field)
if callable(val):
val = val()
if type(val) == unicode:
val = val.encode("utf-8")
row.append(val)
writer.writerow(row)
(来源:)
以下是我获取所有模型的方式(主模型+链接到主模型的模型):
我的问题是:如何将此查询集链接到转储函数?到目前为止,我仅从ActsInfoModel获得数据…
我是否应该使用以下代码,用于显示和检查所有数据:
for act in db_queryset.iterator():
#ActsIdsModel
for field in act.actId.__class__._meta.fields:
print field.name, getattr(act.actId, field.name)
#ActsInformationModel
for field in act.__class__._meta.fields:
print field.name, getattr(act, field.name)
#RespProposModel (3 respPropos)
for index in xrange(1,4):
index=str(index)
try:
print getattr(act, "respProposId"+index).respPropos
print getattr(act, "respProposId"+index).nationResp.nationResp
print getattr(act, "respProposId"+index).euGroupResp.euGroupResp
except Exception, e:
print "exception", e
#NPModel (gvtCompo)
for gvtCompo in act.gvtCompo.all():
print "gvtCompo", gvtCompo.gvtCompo
Django应用程序往往数据量很大。一个常见的任务是将数据集导出到csv(逗号分隔值),csv是一个纯文本文件,可以加载到电子表格中并进行进一步操作。首先要做的是确保您了解Python csv库
如果要导出关于一个模型的所有数据,请参见
使用值列表和
Django ORM查询速记。首先将导出定义为数据结构
export_info = [
("Role", "role__name"),
("Department", "department"),
("Last Name", "person__last_name"),
("First Name", "person__first_name"),
]
元组中的第一项是行标题,第二项是指向所需值的ORM路径。它将被传递到值列表中。需要注意的一个怪癖是,如果您有一个关系,并且没有在关系上指定您感兴趣的字段,那么您将只获得对象的id。未调用模型的unicode方法。为了更好地了解这个示例中的模型
class Position(models.Model):
role = models.ForeignKey("Role")
department = models.CharField(max_length=256)
person = models.ForeignKey("Person")
class Role(models.Model):
name = models.CharField(max_length=256)
class Person(models.Model):
first_name = models.CharField(max_length=256)
last_name = models.CharField(max_length=256)
The core logic looks like this.
global export_info
positions = Position.objects.all().order_by("role__name",
"person__last_name")
# The inverse of zip is zip
headers, fields = zip(*export_info)
rows = [headers]
for position in positions:
qs = Position.objects.filter(pk=position.id)
# convert values like datetimes into unicode objects
rows.append([unicode(v) for v in qs.values_list(*fields)[0]])
最后一行是魔法发生的地方。如果你对它的作用感到困惑,我建议你在你的口译人员那里通读一遍。完成此代码后,您将拥有作为csv文件的行列表。剩下的就是将结果写入代理文件并在响应中返回
f = StringIO.StringIO()
writer = UnicodeWriter(f)
for row in rows:
writer.writerow(row)
response = HttpResponse(f.getvalue(), mimetype="text/csv")
response['Content-Disposition'] = 'attachment; filename=export.csv'
return response
要获取StringIO,请执行“将cStringIO作为StringIO导入”。UnicodewriterforCSV是一段受Python文档本节启发的定制代码。
如果所有数据都是ASCII,则可以使用普通csv库编写器,如果愿意,可以使用不同的文件代理对象
我可以用它导出所有链接到主ActsInfoModel的模型吗?我读到“如果您要导出关于一个模型的所有数据”。。。
class Position(models.Model):
role = models.ForeignKey("Role")
department = models.CharField(max_length=256)
person = models.ForeignKey("Person")
class Role(models.Model):
name = models.CharField(max_length=256)
class Person(models.Model):
first_name = models.CharField(max_length=256)
last_name = models.CharField(max_length=256)
The core logic looks like this.
global export_info
positions = Position.objects.all().order_by("role__name",
"person__last_name")
# The inverse of zip is zip
headers, fields = zip(*export_info)
rows = [headers]
for position in positions:
qs = Position.objects.filter(pk=position.id)
# convert values like datetimes into unicode objects
rows.append([unicode(v) for v in qs.values_list(*fields)[0]])
f = StringIO.StringIO()
writer = UnicodeWriter(f)
for row in rows:
writer.writerow(row)
response = HttpResponse(f.getvalue(), mimetype="text/csv")
response['Content-Disposition'] = 'attachment; filename=export.csv'
return response