Lauren
Lauren

Reputation: 55

How would I write a CSV file populated with my sqlite3 db?

I'm a little confused on how I would populate the following csv function with the information in my models.py for a given user. Can anyone point me in the right direction? Do I need to process the information in a separare py file, or can I do it in my views?

My view to download the info

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

One of the models who's info i'm interesting in saving

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)

Upvotes: 4

Views: 240

Answers (2)

joeln
joeln

Reputation: 3633

First you need to query your django model, something like: DailyVital.objects.all() or DailyVital.objects.filter(user=request.user)

Then you can either transform the objects manually into tuples, or you can use Django QuerySet's values_list method with a list of field names to return tuples instead of objects. Something like:

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

If you didn't need it in Django, you might also consider the sqlite3 command line program's -csv option.

Upvotes: 1

Jeff Tratner
Jeff Tratner

Reputation: 17066

An easy way to do this would be to convert your models into a list of lists.

First you need an object to list function:

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]

Then you just pass that to the csvwriter with a list comprehension (given some list_of_objects that you've queried)

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

writer.writerows([object2list(obj, attr_list) for obj in list_of_objects])

Upvotes: 0

Related Questions