Skip to content

Commit 93236a0

Browse files
committed
Allow a custom ordering of headers in CSVRenderer
Enabled by the code from @robguttman in pull request #3
1 parent 0c553cf commit 93236a0

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

rest_framework_csv/renderers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class CSVRenderer(BaseRenderer):
1212
media_type = 'text/csv'
1313
format = 'csv'
1414
level_sep = '.'
15+
headers = None
1516

1617
def render(self, data, media_type=None, renderer_context=None):
1718
"""
@@ -43,6 +44,7 @@ def tablize(self, data):
4344
# each item designates the name of the column that the item will
4445
# fall into.
4546
data = self.flatten_data(data)
47+
data.header = data.header or self.headers
4648

4749
# Get the set of all unique headers, and sort them (unless already provided).
4850
if not data.header:
@@ -127,4 +129,4 @@ def flatten_dict(self, d):
127129

128130

129131
class CSVRendererWithUnderscores (CSVRenderer):
130-
level_sep = '_'
132+
level_sep = '_'

rest_framework_csv/tests.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ def test_render_ordered_rows(self):
7777
dump = renderer.render(data)
7878
self.assertEqual(dump, csv_file) # field order should be maintained
7979

80+
def test_render_subset_of_fields(self):
81+
renderer = CSVRenderer()
82+
renderer.headers = ['a', 'c.x']
83+
84+
data = [{'a': 1, 'b': 2},
85+
{'b': 3, 'c': {'x': 4, 'y': 5}}]
86+
dump = renderer.render(data)
87+
self.assertEqual(dump, 'a,c.x\r\n'
88+
'1,\r\n,'
89+
'4\r\n')
90+
8091

8192
class TestCSVParser(TestCase):
8293

0 commit comments

Comments
 (0)