If you have a dataset that is too large to fit in memory comfortably,
the ability to pass a generator to an httpresponse means you can break
it up into multiple smaller queries (outside the template system
anyway):

def queryset_to_csv(queryset,delimiter=',',steps=500):
    """ generator for large querysets """
    try: # raw query set
        fieldmeta = queryset.model._meta.fields
    except AttributeError: # it's been evaluated
        fieldmeta = qs._meta.fields
    fields = []
    row= []
    for f in fieldmeta:
        fields.append(f.get_attname())
        row.append('"'+f.name+'"')

    yield "%s\r\n" % delimiter.join(row)

    ids=[o["id"] for o in queryset.values("id")]
    count=len(ids)
    for n in range(steps,count+steps,steps):
        lo,hi=n-steps,n
        qs=queryset.model.objects.filter(pk__in=ids[lo:hi])
        it=[]
        for i in qs:
            row = []
            for f in fields:
                val =
str(getattr(i,f)).replace('"',"'").replace(delimiter,' ')
                row.append('"'+val+'"')
            it.append(delimiter.join(row))
        yield "\r\n".join(it)

...
return HttpResponse(queryset_to_csv(somequeryset,',',
250),mimetype='text/csv')

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to