1
- import pandas as pd
2
- from .utils import update_with_verbose , get_related_model
3
1
import django
2
+ import pandas as pd
4
3
4
+ from .utils import update_with_verbose , get_related_model
5
5
6
6
FieldDoesNotExist = (
7
7
django .db .models .fields .FieldDoesNotExist
@@ -36,7 +36,10 @@ def is_values_queryset(qs):
36
36
if django .VERSION < (1 , 9 ): # pragma: no cover
37
37
return isinstance (qs , django .db .models .query .ValuesQuerySet )
38
38
else :
39
- return qs ._iterable_class == django .db .models .query .ValuesIterable
39
+ try :
40
+ return qs ._iterable_class == django .db .models .query .ValuesIterable
41
+ except :
42
+ return False
40
43
41
44
42
45
def read_frame (qs , fieldnames = (), index_col = None , coerce_float = False ,
@@ -117,14 +120,23 @@ def read_frame(qs, fieldnames=(), index_col=None, coerce_float=False,
117
120
* (f for f in zip (fieldnames , fields )
118
121
if f [0 ] not in uniq_fields and not uniq_fields .add (f [0 ])))
119
122
else :
120
- fields = qs .model ._meta .fields
121
- fieldnames = [f .name for f in fields ]
122
- fieldnames += list (qs .query .annotation_select .keys ())
123
+ try :
124
+ fields = qs .model ._meta .fields
125
+ fieldnames = [f .name for f in fields ]
126
+ fieldnames += list (qs .query .annotation_select .keys ())
127
+ except :
128
+ pass
123
129
124
130
if is_values_queryset (qs ):
125
131
recs = list (qs )
126
132
else :
127
- recs = list (qs .values_list (* fieldnames ))
133
+ try :
134
+ recs = list (qs .values_list (* fieldnames ))
135
+ except :
136
+ if fieldnames :
137
+ recs = [object_to_dict (q , fieldnames ) for q in qs ]
138
+ else :
139
+ recs = [object_to_dict (q ) for q in qs ]
128
140
129
141
df = pd .DataFrame .from_records (
130
142
recs ,
@@ -141,3 +153,19 @@ def read_frame(qs, fieldnames=(), index_col=None, coerce_float=False,
141
153
if datetime_index :
142
154
df .index = pd .to_datetime (df .index , errors = "ignore" )
143
155
return df
156
+
157
+
158
+ def object_to_dict (obj , fields : list = None ):
159
+ """
160
+ Convert obj to a dictionary
161
+
162
+ Parameters
163
+ ----------
164
+
165
+ obj: obj to an item of QuerySet
166
+ fieldnames: reserved fields, default to all fields
167
+ """
168
+ if not fields :
169
+ obj .__dict__ .pop ('_state' )
170
+ return obj .__dict__
171
+ return {field : obj .__dict__ .get (field ) for field in fields }
0 commit comments