class CSVDownload(View):
""" Prepares CSV file version to download """
#more code here
f = StringIO.StringIO()
writer = csv.writer(f, dialect='excel')
for v in visit_list:
writer.writerow([v.idfa.idfa, v.name, v.duration, v.firstSeen, v.lastSeen, v.identifier, v.closestProximity])
f.seek(0)
response = HttpResponse(f, content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename=AdvertiserData.csv'
return response
По некоторым причинам, при открытии файла в Excel, файл будет выводиться только последний элемент в списке, см Django/Python: CSV для в цикле перекрывая первую строку каждый раз через
Это заставляет меня думать, что каждая строка переопределяет первую строку. Хотя этого не должно быть. Посмотрите на эти тесты, которые я провел в терминале.
>>> f.getvalue()
'FFAC6F6C-1B2E-47C2-8110-5E619B239FB1,PPTest1,00:00:24,2014-11-11 23:20:24.730000,2014-11-11 23:20:48.750000,nkfe-cnb7s,NEAR\r\nFFAC6F6C-1B2E-47C2-8110-5E619B239FB1,moo2,00:00:24,2014-11-11 23:20:24.730000,2014-11-11 23:20:48.750000,nkfe-cnb7s,NEAR\r\n'
Это возвращает более одного значения, с \r\n
между значениями.
Кроме того, я попытался
>>> print response
Content-Type: text/csv
Content-Disposition: attachment; filename=boo.csv
FFAC6F6C-1B2E-47C2-8110-5E619B239FB1,PPTest1,00:00:24,2014-11-11 23:20:24.730000,2014-11-11 23:20:48.750000,nkfe-cnb7s,NEAR
FFAC6F6C-1B2E-47C2-8110-5E619B239FB1,moo2,00:00:24,2014-11-11 23:20:24.730000,2014-11-11 23:20:48.750000,nkfe-cnb7s,NEAR
И также показали более чем одно значение.
Я недавно увидел SO-поток, который обсуждает добавление в файл: How do you append to a file? Но так как я создаю этот элемент только в памяти (используя stringIO), как я могу получить тот же эффект?
Спасибо!
EDIT Для дополнительной информации:
visit_list
скомпрометирован моделей визита:
class Visit(models.Model):
idfa = models.ForeignKey(Report)
name = models.CharField(max_length=255)
lastSeen = models.CharField(max_length=255)
duration = models.CharField(max_length=255)
firstSeen = models.CharField(max_length=255)
identifier = models.CharField(max_length=255)
closestProximity = models.CharField(max_length=255)
def __unicode__(self):
return self.name
class Meta:
verbose_name = "Visit"
verbose_name_plural = "Visits"
В данном конкретном случае, visit_list возвращает:
>>> visit_list
[<Visit: PPTest1>, <Visit: moo2>]
Что ваш 'visit_list' выглядеть? –