Skip to content

Commit cfd45c8

Browse files
committed
Test: read_frame doesn't populate cache, handles values_list correctly
Fixed a crash when the query set was the result of qs.values_list()
1 parent 4a28342 commit cfd45c8

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

django_pandas/io.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ def read_frame(qs, fieldnames=(), index_col=None, coerce_float=False,
200200
fields = qs.model._meta.fields
201201
fieldnames = [f.name for f in fields]
202202

203-
if not is_values_queryset(qs):
203+
if not issubclass(qs._iterable_class, django.db.models.query.ValuesListIterable):
204204
qs = qs.values_list(*fieldnames)
205205
recs = qs.iterator()
206206

django_pandas/tests/test_io.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ def test_basic(self):
4747
df1 = read_frame(qs, ['col1', 'col2'])
4848
self.assertEqual(df1.shape, (qs.count(), 2))
4949

50-
def test_compress_basic(self):
51-
qs = MyModel.objects.all()
50+
def assert_compress_basic(self, qs):
5251
df = read_frame(qs, compress=True)
5352

5453
# Test automatic inference of dtypes
@@ -59,6 +58,14 @@ def test_compress_basic(self):
5958

6059
# Compress should use less memory
6160
self.assertLess(df.memory_usage().sum(), read_frame(qs).memory_usage().sum())
61+
# Uses qs.iterator() rather than for x in qs.
62+
self.assertFalse(qs._result_cache)
63+
64+
def test_compress_basic(self):
65+
qs = MyModel.objects.all()
66+
self.assert_compress_basic(qs)
67+
self.assert_compress_basic(qs.values())
68+
self.assert_compress_basic(qs.values_list())
6269

6370
def test_compress_bad_argument(self):
6471
qs = MyModel.objects.all()
@@ -103,6 +110,8 @@ def test_compress_custom_field(self):
103110
# Memory usage is ordered as df1 < df2 < read_frame(qs, compress=False)
104111
self.assertLess(df2.memory_usage().sum(), read_frame(qs).memory_usage().sum())
105112
self.assertLess(df1.memory_usage().sum(), df2.memory_usage().sum())
113+
# Uses qs.iterator() rather than for x in qs.
114+
self.assertFalse(qs._result_cache)
106115

107116
def test_values(self):
108117
qs = MyModel.objects.all()

0 commit comments

Comments
 (0)