4

我对如何使用我的 models.py 中给定用户的信息填充以下 csv 函数有点困惑。谁能指出我正确的方向?我需要在单独的 py 文件中处理信息,还是可以在我的视图中处理?

我对下载信息的看法

def download(request):
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment; filename=UserData.csv'
    writer = csv.writer(response)
    writer.writerow(['Date', 'HighBGL', 'LowBGL', 'Diet', 'Weight', 'Height', 'Etc'])
    writer.writerow(['Info pertaining to date 1'])
    writer.writerow(['info pertaining to date 2'])
    return response

我感兴趣的信息模型之一

class DailyVital(models.Model):
    user =  models.ForeignKey(User)
    entered_at = models.DateTimeField()
    high_BGL = models.IntegerField()
    low_BGL = models.IntegerField()
    height = models.IntegerField(blank = True, null = True)
    weight = models.IntegerField(blank = True, null = True)
4

2 回答 2

1

首先,您需要查询您的 django 模型,例如:DailyVital.objects.all()DailyVital.objects.filter(user=request.user)

然后,您可以手动将对象转换为元组,也可以使用带有字段名称列表的 Django 方法来返回元组而不是QuerySet对象values_list就像是:

def download(request):
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment; filename=UserData.csv'
    writer = csv.writer(response)
    writer.writerow(['Date', 'HighBGL', 'LowBGL', 'Weight', 'Height'])
    query = DailyVital.objects.filter(user=request.user)
    for row in query.values_list('entered_at', 'high_BGL', 'low_BGL', 'weight', 'height'):
       writer.writerow(row)
    return response

如果你在 Django 中不需要它,你也可以考虑sqlite3命令行程序的-csv选项。

于 2012-08-23T02:31:42.203 回答
0

一种简单的方法是将模型转换为列表列表。

首先你需要一个对象来列出函数:

def object2list(obj, attr_list):
    " returns values (or None) for the object's attributes in attr_list"
    return [getattr(obj, attr, None) for attr in attr_list]

然后你只需将它传递给带有列表理解的 csvwriter(给定一些list_of_objects你查询过的)

attr_list = ['date', 'high_BGL', 'low_BGL', 'diet', 'weight', 'height']

writer.writerows([object2list(obj, attr_list) for obj in list_of_objects])
于 2012-08-23T02:18:43.520 回答